Pointers

Pointers->포인터 #

// Go는 프로그램내에서 값의 참조와 레코드를 전달할 수 있는 <em><a href="http://en.wikipedia.org/wiki/Pointer_(computer_programming)">pointers</a></em>를 지원합니다.

package main

import "fmt"

// 두 함수 `zeroval`와 `zeroptr`를 가지고 포인터가 값과 다르게 어떻게 동작하는지 살펴봅시다.
//  `zeroval`은 `int` 타입 파라미터를 가지므로 인자는 값으로 전달됩니다.
//  `zeroval`는 함수를 호출할 때의 값을 `ival`에 복사하여 가져옵니다.
func zeroval(ival int) {
	ival = 0
}

// 그에 반해 `zeroptr`는 `int`형 포인터를 받도록 `*int` 타입을 파라미터로 갖고 있습니다.
//  함수안에서 `*iptr`는 메모리 주소에서 해당 주소의 현재값으로 포인터를 _역참조(dereference)_ 합니다.
//  역참조된 포인터에 값을 할당하면 이는 참조된 주소의 값을 바꿉니다.
func zeroptr(iptr *int) {
	*iptr = 0
}

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

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

	// `&i`는 `i`의 메모리 주소를 반환합니다.
	// 즉, `i`의 포인터입니다.
	zeroptr(&i)
	fmt.Println("zeroptr:", i)

	// 포인터도 출력할 수 있습니다.
	fmt.Println("pointer:", &i)
}
# `zeroval`은 `main`에 있는 `i`값을 바꾸지 않지만,
# `zeroptr`은 해당 값의 메모리 주소를 참조하고 있기 때문에 값을 바꿀 수 있습니다.
$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100