Go 함수: 포인터 대 값 매개변수

5859 단어 pointersgo
Golang에는 포인터라는 개념이 있습니다. C, C++와 같은 언어와 유사하게 작동하며 변수 값이 저장되는 메모리 주소를 나타냅니다.

포인터here 에 대한 자세한 내용은 이 게시물의 목적이 아니기 때문에 볼 수 있습니다.

이 개념에서 포인터 매개변수 및 값 매개변수와 함께 작동하는 함수를 가질 수 있습니다.

차이점은 함수를 선언하는 방법과 조작 중에 변수가 처리되는 방법입니다.

코드



차이점을 더 잘 설명하기 위해 구조체를 만들어 함수 내에서 속성을 조작하고 구조체 유형과 함수를 사용하여 변수를 선언할 수 있습니다. 하나는 포인터 매개변수가 있고 함수는 값 매개변수가 있습니다.

따라서 Name과 Github가 포함된 User 구조체가 있습니다.

type User struct {
    Name   string
    Github string
}

그리고 Name 속성을 변경하고 구조체 값을 출력하는 기능을 담당합니다.

func changeAndLogPointer(user *User) {
    user.Name = "Bruno Vasconcelos"
    fmt.Printf("Name: %s, Github: %s\n", user.Name, user.Github)
}

func changeAndLogValue(user User) {
    user.Name = "Bruno Vasconcelos"
    fmt.Printf("Name: %s, Github: %s\n", user.Name, user.Github)
}

첫 번째(changeAndLogPointer)는 포인터를 받고 두 번째(changeAndLogValue)는 값을 받습니다.

그래서 우리는 포인터 접근 방식을 사용하는 메인 함수를 실행할 것입니다

func main() {
    user := &User{Name: "Bruno", Github: "brunohgv"}
    changeAndLogPointer(user)
    fmt.Printf("Name: %s, Github: %s\n", user.Name, user.Github)
}

실행 결과는 다음과 같습니다.

Name: Bruno Vasconcelos, Github: brunohgv
Name: Bruno Vasconcelos, Github: brunohgv

포인터를 사용할 때 모든 변경 사항이 값이 저장된 메모리 주소와 관련되기 때문에 발생합니다. 매개변수를 변경하면 매개변수로 전달된 변수에 영향을 미칩니다.

이제 값을 사용하여 함수를 실행합니다.

func main() {
    user := &User{Name: "Bruno", Github: "brunohgv"}
    changeAndLogValue(*user)
    fmt.Printf("Name: %s, Github: %s\n", user.Name, user.Github)
}

결과는 다음과 같습니다.

Name: Bruno Vasconcelos, Github: brunohgv
Name: Bruno, Github: brunohgv

왜 이런 일이 발생합니까?
값을 매개변수로 전달하기 때문에 Go 컴파일러는 이 변수를 내부적으로 처리할 또 다른 메모리 공간을 생성합니다. 즉, 함수 내부의 모든 변경 사항이 내부 변수에 영향을 미치고 원래 변수는 그대로 유지됩니다.

그렇다면 가장 좋은 방법은 무엇입니까?



글쎄, 그것은 달려있다. 포인터는 원래 값을 변경하려는 경우 나중에 수정된 값을 사용하는 것보다 더 나은 옵션입니다.
변경을 방지하고 함수 내에서만 조작하는 것이 목표라면 값이 가장 좋은 방법입니다.

모든 접근 방식에 대한 다른 용도가 있지만 기본 사항을 이해하는 것이 응용 프로그램에 가장 적합한 선택을 결정하는 가장 좋은 방법입니다.

좋은 웹페이지 즐겨찾기