[go] Go 언어에서 포인터를 어떻게 사용하나요?

Go 언어에서 포인터를 사용하여 변수의 주소를 저장하고 해당 주소에서 값에 접근할 수 있습니다. 이를 통해 메모리를 효율적으로 활용할 수 있고, 함수로부터 여러 개의 값을 반환하는 등 다양한 용도로 활용할 수 있습니다.

포인터 변수 선언과 초기화

포인터 변수를 선언하기 위해서는 *기호를 사용합니다. 변수를 선언하고 해당 변수의 주소를 저장하는 포인터를 초기화하는 예시는 다음과 같습니다.

package main

import "fmt"

func main() {
    var num int = 10
    var ptr *int

    ptr = &num

    fmt.Printf("num의 값: %d\n", num)   // num의 값: 10
    fmt.Printf("ptr이 가리키는 값: %d\n", *ptr)   // ptr이 가리키는 값: 10
}

위의 예시에서 & 기호는 변수의 주소를 나타내며, * 기호는 포인터가 가리키는 값을 나타냅니다.

포인터를 활용한 함수

Go 언어에서 함수는 기본적으로 값에 의한 호출(Call by Value)이지만, 포인터를 이용하면 참조에 의한 호출(Call by Reference)로 동작하도록 만들 수 있습니다.

package main

import "fmt"

func main() {
    var num int = 10

    fmt.Printf("변경 전 num의 값: %d\n", num)   // 변경 전 num의 값: 10
    changeValue(&num)
    fmt.Printf("변경 후 num의 값: %d\n", num)   // 변경 후 num의 값: 20
}

func changeValue(ptr *int) {
    *ptr = 20
}

위의 예시에서 changeValue 함수는 ptr *int 타입의 포인터를 매개변수로 받아 해당 포인터가 가리키는 값을 변경하고 있습니다.

포인터를 사용함으로써 메모리를 직접 조작할 수 있으므로 주의가 필요합니다. 잘못된 포인터 조작은 런타임 에러를 초래할 수 있으므로 신중하게 다루어야 합니다.

더 많은 정보는 Go 언어 공식 문서에서 확인할 수 있습니다.