>백엔드 개발 >Golang >Go의 값별 전달 메커니즘은 포인터를 사용하여 참조별 전달을 어떻게 모방합니까?

Go의 값별 전달 메커니즘은 포인터를 사용하여 참조별 전달을 어떻게 모방합니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-19 07:29:19280검색

How Does Go's Pass-by-Value Mechanism Mimic Pass-by-Reference Using Pointers?

Go 함수의 참조 및 값 전달 이해

Go에서는 참조 및 값 전달 개념이 처음에는 혼란스러울 수 있습니다. 명확히 말하자면 Go는 주로 값 전달을 지원한다는 점을 주목할 가치가 있습니다. 그러나 객체에 포인터를 전달할 때는 참조에 의한 전달을 모방합니다.

이를 이해하려면 다음 Java 함수를 고려하세요.

databaseFunction(DatabaseType db) {
  // do something
}

이 코드에서 DatabaseType 인스턴스 db는 값으로 함수에 전달됩니다. 그러나 Go에서는 다음과 같이 표시될 수 있습니다.

func PutTasks(db *sql.DB) echo.HandlerFunc {

}

Go 예에서 sql.DB 앞의 별표 *는 함수가 sql.DB 인스턴스에 대한 포인터를 예상한다는 것을 의미합니다. 이는 Go에서 포인터 유형의 값이 주소를 보유하기 때문입니다.

언급한 치트 시트에 따르면 func PrintPerson(p *Person) 구문은 함수가 Person 객체에 대한 포인터 주소만 허용함을 나타냅니다. 여기서 포인터를 사용하는 이유는 함수가 전달된 원래 객체를 수정할 수 있도록 하기 위한 것입니다.

더 자세히 설명하려면 다음 Go 코드를 고려하세요.

func someFunc(x *int) {
  *x = 2 // Whatever variable caller passed in will now be 2
  y := 7
  x = &y // has no impact on the caller because we overwrote the pointer value!
}

이 예에서는 , x는 정수에 대한 포인터입니다. 이를 역참조함으로써 그것이 가리키는 값을 직접 수정할 수 있습니다. 그러나 다른 변수를 가리키도록 x를 다시 할당해도 호출자는 원래 가리킨 값이 아니라 포인터 변수의 복사본만 가지므로 호출자에게 영향을 주지 않습니다.

따라서 포인터를 사용하면 메커니즘이 제공됩니다. 호출자와 함수 간에 값을 공유하여 함수 내에서 변경된 내용이 원래 개체에 다시 반영되도록 합니다.

위 내용은 Go의 값별 전달 메커니즘은 포인터를 사용하여 참조별 전달을 어떻게 모방합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.