«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему мой метод GO не изменяет значение экземпляра, если я не использую приемник указателя?

Почему мой метод GO не изменяет значение экземпляра, если я не использую приемник указателя?

Опубликовано в 2025-02-06
Просматривать:190

Why Doesn't My Go Method Modify the Instance Value Unless I Use a Pointer Receiver?

Golang метод с помощью Pointer Receiver

] При попытке изменить значение экземпляра с помощью метода крайне важно понять концепцию указателя. приемники. В этом примере метод Setsomefield не работает, как ожидалось, потому что его приемник не имеет типа указателя.

, чтобы исправить это, мы изменяем метод SetSomefield, чтобы принять приемник указателя следующим образом:

func (i *Implementation) SetSomeField(newValue string) {
    ...
}

, однако, это изменение вводит новую проблему: struct больше не реализует интерфейс, потому что метод GetSomefield по -прежнему имеет приемник значения.

решение заключается в использовании указателя на структуру, когда Реализация интерфейса. Таким образом, мы включаем метод изменять фактический экземпляр без создания копии. Вот модифицированный код:

type IFace interface {
    SetSomeField(newValue string)
    GetSomeField() string
}

type Implementation struct {
    someField string
}

func (i *Implementation) GetSomeField() string {
    return i.someField
}

func (i *Implementation) SetSomeField(newValue string) {
    i.someField = newValue
}

func Create() *Implementation {
    return &Implementation{someField: "Hello"}
}

func main() {
    var a IFace
    a = Create()
    a.SetSomeField("World")
    fmt.Println(a.GetSomeField())
}

В этом обновленном коде функция Create возвращает указатель в struct реализации, которая реализует интерфейс IFACE. Следовательно, переменная типа IFACE может относиться к указателю к структуре реализации, позволяя методу SetSomefield изменять его значение.

]
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3