Вызов Golang по ссылке

# #go

Вопрос:

Я хочу понять вызов голанга по ссылке.Я написал этот фрагмент кода. Когда я печатаю оба адреса(1-й адрес в главном и 2-й адрес в указателе печати, он выглядит по-другому).Пожалуйста, помогите лучше понять.

 package main

import "fmt"

type person struct{
 name string
 id string
}

func main() {
//struct
 c := person{name: "vijay", id: "1234",}
 fmt.Println(amp;c)
 printPointer(amp;c)
 fmt.Println(c)

}

func printPointer(p *person) {
 (*p).name = "Sree"
fmt.Println(amp;p)
}
 

Комментарии:

1. У Go нет ссылки на вызов. Go имеет вызов по значению с возможностью передачи ссылки в качестве значения либо явно (как вы делаете), либо неявно (вызовы методов, для которых требуется указатель на экземпляр метода). С неявным указателем разница относительно невелика, но явный стиль указателя-это то, что делает этот вызов по значению в первую очередь.

Ответ №1:

В go все аргументы передаются по значению. Таким образом:

 fmt.Println(c)
 

Это получает копию c

 fmt.Println(amp;c)
 

Это получила копия amp;c .

В вашем коде printPointer получает копию amp;c as p . При amp;p печати вы печатаете адрес этой копии, а не amp;c .

Воспользуйся fmt.Println(p) .

Ответ №2:

В printPointer , вы печатаете значение amp;p или «указатель на p». p имеет тип *person , или «указатель на человека». Таким образом, значение, которое вы на самом деле печатаете, имеет тип «указатель на указатель на человека», что, я думаю, не входит в ваши намерения.

Попробуйте просто распечатать p .