Go 함수: 포인터 대 값 매개변수
포인터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 컴파일러는 이 변수를 내부적으로 처리할 또 다른 메모리 공간을 생성합니다. 즉, 함수 내부의 모든 변경 사항이 내부 변수에 영향을 미치고 원래 변수는 그대로 유지됩니다.
그렇다면 가장 좋은 방법은 무엇입니까?
글쎄, 그것은 달려있다. 포인터는 원래 값을 변경하려는 경우 나중에 수정된 값을 사용하는 것보다 더 나은 옵션입니다.
변경을 방지하고 함수 내에서만 조작하는 것이 목표라면 값이 가장 좋은 방법입니다.
모든 접근 방식에 대한 다른 용도가 있지만 기본 사항을 이해하는 것이 응용 프로그램에 가장 적합한 선택을 결정하는 가장 좋은 방법입니다.
Reference
이 문제에 관하여(Go 함수: 포인터 대 값 매개변수), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/brunohgv/go-functions-pointer-vs-value-params-8af텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)