В golang форма метода struct выглядит следующим образом:
func (r ReceiverType) funcName(параметры) (результаты)
Если вы хотите изменить значение члена структуры, его тип ReceiverType должен быть в форме struct* при определении метода. Если ReceiverType равен struct, значения членов структуры изменить нельзя.
Без лишних слов, проверка кода:
package main
import (
"fmt"
)
type tag struct {
value int32
}
func (_tag tag) Change() {
_tag.value = int32(987)
}
type tag2 struct {
value int32
}
func (_tag *tag2) Change2() {
_tag.value = int32(987)
}
func main() {
_tag := new(tag)
_tag.value = 123
_tag.Change()
fmt.Println(_tag)
_tag.Change()
fmt.Println(_tag)
_tag2 := tag2{41}
_tag2.Change2()
fmt.Println(_tag2)
_tag2.Change2()
fmt.Println(_tag2)
}
В приведенной выше основной функции объект _tag в первом коде имеет форму *tag, но его метод Change не может изменить его значение. Объект _tag во втором фрагменте кода имеет форму *ag, но его метод Change может изменить его значение.
Если кому интересно, расскажу подробнее.
Первым параметром метода в golang является его ReceiverType, тогда как метод метода в языках на основе C, таких как C++ и аналогичный ему язык Java, по умолчанию имеет значение class* this. Другими словами, в golang есть два метода: передача значения объекта и передача адреса объекта, тогда как языки серии C в обязательном порядке требуют передачи адреса объекта.
Это делает это понятным, не так ли?