Go by Example: [17] Pointers
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]
}
zeroval
과zeroptr
함수를 이용해서 포인터가 어떻게 작동되는지에 대해서 설명 하겠습니다.
zeroval()
함수는 정수한개를 인수로 받으며, 복사본 값으로 전달됩니다.
이 함수는 전달받은 인자를ival
내부변수 실제 값을 복사해서 전달 받습니다.zeroptr()
함수는*int
형 인자를 전달하고 있습니다. 이것이 바로int
형 포인터입니다.
*iptr
변수의 의미는 역참조라고 부르며, 해당변수에 저장된 주소값이 아닌 실제값에
접근할 수 있는 문장 부호입니다. 여기서는iptr
변수의 주소에 저장된 값을 의미합니다.
역참조로 값을 대입하면, 실제 변수의 주소에 찾아간 후 해당 주소의 값(내용)을 대입합니다.&i
형식으로 메모리내의 위치인 주소값을 구할 수 있습니다. (변수 i의 포인터값이라 부릅니다)- 포인터값(주소값)을 출력할 수 있습니다. 주소값은 동일하지 않습니다.
실행하면 다음과 같습니다.
$ go run pointers.go
initial: 1
zeroval: 1
zeroptr: 0
pointer: 0x42131100
zeroval()
함수는 main()
함수내의 i
변수를 변경하지 않습니다. (복사본으로 수행)
하지만, zeroptr()
함수는 변수의 실제 주소를 찾아가서 변경하기 때문에, 실제 값이 변경됨을
알 수 있습니다.