Как я могу получить реальный указатель на поле внутри структуры в Go? - PullRequest
0 голосов
/ 12 июля 2020

У меня есть структура, скажем:

type sample struct{
   data []float64
}

Теперь я объявляю метод:

func (s sample) Get() *[]float64{
return &s.data
}

Я пытаюсь добавить к этому фрагменту указатель, полученный через Get ()

func main(){
example := sample{[]float64{1,2,3}}

//Here I will append:
pointerToArray := example.Get()
*pointerToArray = append(*pointerToArray, 4)
fmt.Println(example.Get()) // still shows only &{1,2,3}
}

У меня есть общее представление о том, почему это происходит: функция Get возвращает адрес своей локальной области, и я исправил это, изменив саму структуру на

type sample struct{
data *[]float64
}

, для которого код возвращает ожидаемое &{1,2,3,4}

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

1 Ответ

4 голосов
/ 12 июля 2020

Проблема в том, что вы определили метод Get с помощью структуры-получателя, а не с помощью указателя. Это означает, что когда вы возвращаете &s.data, вы получаете адрес поля получателя, а не из исходной структуры. Вы можете исправить это, просто используя приемник указателя:

func (s *sample) Get() *[]float64{
    return &s.data
}

Вот полный исполняемый пример (https://play.golang.org/p/AIj8QOYfx85)

package main

import "fmt"

type sample struct {
    data []float64
}

func (s *sample) Get() *[]float64 {
    return &s.data
}

func main() {
    example := sample{[]float64{1, 2, 3}}

    p := example.Get()
    *p = append(*p, 4)
    fmt.Println(example.Get())
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...