# #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
.