First of all, this was not wasted at all. I really appreciate your work here and thank you for what you have done here. But you really changed the way the library is working now. For example I never wanted to return something from Add or Remove. 

I asked lots of questions. For example the t was always locked before processed, for example here: https://github.com/fatih/goset/blob/master/set.go#L156 , here t.List() is locked, I mean do we really need seperate locks ? I'm asking this because each of the methods in master is already locked. When you say t.List() it uses their own lock. Right?