Pointers

Go언어는 c/c++언어와 같이 포인터를 언어차원에서 지원합니다.
프로그램에서 값이 저장된 실제 주소값(`Reference``)을 전달할 수 있으며,
함수의 인자로 포인터를 전달해서, 대용량의 자료구조를 빠르게 처리할 수 도 있습니다.

package main

import "fmt"

func zeroval(ival int) {               // [1]
    ival = 0
}

func zeroptr(iptr *int) {              // [2]
    *iptr = 0
}

func main() {

    i := 1
    fmt.Println("initial:", i)

    zeroval(i)
    fmt.Println("zeroval:", i)

    zeroptr(&i)                        // [3]
    fmt.Println("zeroptr:", i)

    fmt.Println("pointer:", &i)        // [4]
}
  1. zerovalzeroptr함수를 이용해서 포인터가 어떻게 작동되는지에 대해서 설명 하겠습니다.
    zeroval()함수는 정수한개를 인수로 받으며, 복사본 값으로 전달됩니다.
    이 함수는 전달받은 인자를 ival 내부변수 실제 값을 복사해서 전달 받습니다.
  2. zeroptr()함수는 *int형 인자를 전달하고 있습니다. 이것이 바로 int포인터입니다.
    *iptr변수의 의미는 역참조라고 부르며, 해당변수에 저장된 주소값이 아닌 실제값
    접근할 수 있는 문장 부호입니다. 여기서는 iptr변수의 주소에 저장된 값을 의미합니다.
    역참조로 값을 대입하면, 실제 변수의 주소에 찾아간 후 해당 주소의 값(내용)을 대입합니다.
  3. &i 형식으로 메모리내의 위치인 주소값을 구할 수 있습니다. (변수 i의 포인터값이라 부릅니다)
  4. 포인터값(주소값)을 출력할 수 있습니다. 주소값은 동일하지 않습니다.

실행하면 다음과 같습니다.

$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100

zeroval()함수는 main()함수내의 i변수를 변경하지 않습니다. (복사본으로 수행)
하지만, zeroptr()함수는 변수의 실제 주소를 찾아가서 변경하기 때문에, 실제 값이 변경됨을
알 수 있습니다.