Well but now it's not simple anymore. I didn't return a new set for every single Remove or Add method. Because it was always acting on the underlying pointer. Now it's hard to use it for concurrent usages too, because passing the one pointer to multiple go routines is and work on that after an Add, Remove, .. is not possible, because I have to take care of the returned pointer. I really appreciate your work here, but you should not change the way the library is working. Why don't we assume that an empty set is an allocated map with zero length?