> 백엔드 개발 > Golang > 함수 인수로 전달된 포인터가 수정되고 있는지, 아니면 복사본이 수정되고 있는지 확인하는 방법은 무엇입니까?

함수 인수로 전달된 포인터가 수정되고 있는지, 아니면 복사본이 수정되고 있는지 확인하는 방법은 무엇입니까?

WBOY
풀어 주다: 2024-02-06 10:15:11
앞으로
1052명이 탐색했습니다.

함수 인수로 전달된 포인터가 수정되고 있는지, 아니면 복사본이 수정되고 있는지 확인하는 방법은 무엇입니까?

질문 내용

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 함수가 포인터 복사본을 수정하나요?

initialfinal的函数参数都指向pmain中的内存地址; initial 能够更改 p,而 final 안돼요.

이런 일이 발생하는 이유에 대한 설명을 주시면 매우 감사하겠습니다.


정답


포인터가 가리키는 데이터를 수정하려면 포인터를 역참조해야 합니다. 역참조 연산자는 *。然而,为了方便使用,Go 在某些情况下会隐式插入解引用操作。例如,number.x = 1 被转换为 (*number).x = 1입니다.

이 암시적 번역은 혼란스러울 수 있지만 번역이 발생하지 않으면 number.x = 1 将毫无意义,因为 number 표현식은 포인터 유형이고 포인터에는 필드가 없다는 것을 알아야 합니다.

요약하자면, initial 函数具有隐式指针解引用,而 final 그렇지 않습니다.

원하신다면 final 更改为显式且正确地取消引用,*number = Numbers{2, 2},那么它也会更改 p.

위 내용은 함수 인수로 전달된 포인터가 수정되고 있는지, 아니면 복사본이 수정되고 있는지 확인하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿