>백엔드 개발 >Golang >Go는 참조 및 값에 의한 전달을 어떻게 처리하며 별표(*)를 사용하는 이유는 무엇입니까?

Go는 참조 및 값에 의한 전달을 어떻게 처리하며 별표(*)를 사용하는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-24 00:35:12860검색

How Does Go Handle Pass by Reference and Value, and Why Use the Asterisk (*)?

Go 함수에서 참조 및 값 전달

Go에서 참조 및 값 전달 개념은 특히 비교할 때 혼란스러울 수 있습니다. Java와 같은 다른 언어로. 이 글에서는 차이점을 명확히 하고 Go에서 특정 유형 앞에 별표(*)를 사용해야 하는 이유를 설명합니다.

참조에 의한 전달과 값에 의한 전달

Go는 기술적으로 값으로만 ​​전달됩니다. 즉, 변수를 함수에 전달하면 해당 변수의 복사본이 생성되어 전달됩니다. 함수 내의 복사본에 대한 변경 사항은 원래 변수에 영향을 주지 않습니다.

그러나 포인터를 개체에 전달할 때 포인터를 값별로 전달하는 것과 같습니다. 포인터 자체는 객체의 메모리 주소를 포함하는 값입니다. 포인터를 통해 객체에 적용된 모든 변경 사항은 함수 외부의 원래 객체에 반영됩니다.

별표(*)의 필요성

별표(* ) Go에서는 해당 유형이 지정된 유형에 대한 포인터임을 나타내는 데 사용됩니다. 예를 들어, 다음 함수는 sql.DB 객체에 대한 포인터를 기대합니다.

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

Go에서는 객체를 값으로 전달할 것인지 참조로 전달할 것인지 명시적으로 지정해야 하기 때문에 이 구문이 필요합니다. 별표를 포함하지 않으면 함수는 이 함수에 유효한 유형이 아닌 sql.DB 값을 예상하게 됩니다.

포인터로 전달하는 이유는 무엇입니까?

포인터를 통한 전달은 호출자와 함수 본문 간에 값을 공유하려는 경우에 사용됩니다. 함수 내의 객체에 대한 모든 변경 사항은 호출자의 변수에 반영됩니다. 이는 호출자의 개체를 수정하거나 큰 개체를 복사하지 않고 효율적으로 액세스해야 할 때 필요합니다.

다음 Go 코드를 고려하세요.

func someFunc(x *int) {
    *x = 2 // Modifies the original variable
    y := 7
    x = &y // Changes the pointer to point to a different variable
}

이 예에서 someFunc 함수는 정수 x에 대한 포인터를 사용합니다. 함수 내에서 포인터는 원래 변수를 수정하기 위해 역참조(*)됩니다. 또한 포인터는 다른 변수 y를 가리키도록 다시 할당됩니다. 이 변경 사항은 함수 내에서 포인터 자체가 수정되었기 때문에 호출자의 변수에 반영됩니다.

결론

Go에서 참조와 값으로 전달하는 것은 이해하기 위한 기본 개념입니다. . 별표(*)는 유형에 대한 포인터를 전달한다는 것을 나타내는 데 사용됩니다. 이를 통해 호출자와 함수 본문 간에 값을 공유할 수 있습니다. 이는 호출자의 변수를 수정하거나 큰 개체를 효율적으로 처리할 때 특히 유용합니다.

위 내용은 Go는 참조 및 값에 의한 전달을 어떻게 처리하며 별표(*)를 사용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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