package main import ( "fmt" ) type Numbers struct { x int y int } func initial(number *Numbers) { number.x = 1 number.y = 1 } func final(number *Numbers) { number = &Numbers{2, 2} } func main() { p := Numbers{0, 0} fmt.Println(p) //Prints {0 0} initial(&p) fmt.Println(p) //Prints {1 1} final(&p) fmt.Println(p) //Expected to print {2, 2} but prints {1, 1} }
왜 initial
函数修改指针,而 final
함수가 포인터 복사본을 수정하나요?
initial
和final
的函数参数都指向p
在main
中的内存地址; initial
能够更改 p
,而 final
안돼요.
이런 일이 발생하는 이유에 대한 설명을 주시면 매우 감사하겠습니다.
포인터가 가리키는 데이터를 수정하려면 포인터를 역참조해야 합니다. 역참조 연산자는 *
。然而,为了方便使用,Go 在某些情况下会隐式插入解引用操作。例如,number.x = 1
被转换为 (*number).x = 1
입니다.
이 암시적 번역은 혼란스러울 수 있지만 번역이 발생하지 않으면 number.x = 1
将毫无意义,因为 number
표현식은 포인터 유형이고 포인터에는 필드가 없다는 것을 알아야 합니다.
요약하자면, initial
函数具有隐式指针解引用,而 final
그렇지 않습니다.
원하신다면 final
更改为显式且正确地取消引用,*number = Numbers{2, 2}
,那么它也会更改 p
.
위 내용은 함수 인수로 전달된 포인터가 수정되고 있는지, 아니면 복사본이 수정되고 있는지 확인하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!