[Go] 포인터 & 참조 타입
Go에서는 포인터와 참조 타입(슬라이스, 맵, 채널, 함수, 메서드)을 모두 제공한다. 참조 타입은 데이터를 직접 가지지 않고 데이터의 메모리 공간을 가리킨다. 포인터는 값에 접근 하는 수단이고 주소값을 직접 변경할 수 없다.
포인터 생성 & 초기화
포인터 변수는 *타입 방식으로 선언한다. 64비트 머신에서 포인터는 16바이트, 32비트 머신에서는 8바이트 크기를 가진다.
포인터를 생성하는 방식
1. 주소 연산자 &로 메모리 주소를 포인터 변수에 할당
2. new() 함수로 초기화한 메모리를 포인터 변수에 할당
&을 사용하여 포인터 생성
var p *int // 포인터 생성
value := 1024
p = &value // 메모리 주소 할당
p에는 주소 값이 저장되어 있다. 주소 값에 있는 값을 가져오기 위해서는 C와 마찬가지로 포인터 앞에 * 연산자를 붙이면 된다.
*p
p와 value의 관계
- p == &i
- *p == i
구조체 포인터
int 포인터를 출력하면 포인터의 주소값이 출력된다.
struct 포인터를 출력하면 주소값은 출력되지 않고 &구조체의 값이 함께 출력된다.
&을 사용하여 포인터 생성
new() 함수는 메모리 공간에 매개변수로 전달 받은 타입에 맞게 초기화를 하고 주소를 리턴한다.
call by reference
Go에서 함수를 호출할 때 call-by-value 방식으로 동작한다.매개변수로 전달받은 값을 변경하고 싶다면 포인터를 사용하여 call-by-reference를 하면 된다.
배열 대신 슬라이스를 함수에 전달하면, 참조가 전달 되어 시스템의 부담을 줄일 수 있다.
구조체도 슬라이스와 마찬가지로 포인터로 전달을 하면 시스템의 부담을 줄일 수 있다.
구조체 포인터를 사용한 경우 구조체의 값이 변경되었다. 구조체도 call-by-value 방식으로 동작하는 것을 확인할 수 있다.