It's because your method receivers are values, not pointers:
func (b Builder) setFirst() {
b.firstElement = "First element"
}
In Go, method receivers work a lot like regular function arguments. When you call the above method, you're operating on a copy of the Builder struct. Any time you pass an argument by value like this, its value is copied. What you probably want is to define the method on a pointer receiver:
func (b *Builder) setFirst() {
b.firstElement = "First element"
}
Now, when you call this method on an object, only the pointer is copied. Inside the method, you're referring to the same Builder instance that you are when calling the method.