1. Pointer
C 언어와 비슷하게 * 을 표시하여 정의 출력은 %p을 이용하여 출력할 수 있다.
var a int = 500
var p *int
p = &a
fmt.Printf("p의 값: %p\n", p) // p의 메모리 주소 출력
fmt.Printf("p가 가르키는 메모리의 값: %d\n", *p) // Dereference p
포인터의 초기값은 0 입니다. 그리고 nil로 이것을 판단할 수 있습니다. (메모리 0은 의미있는 값이 아니므로 go 에서 이렇게 판단합니다.) (다른 변수들은 0, 0.0, "" 등은 의미있는 값일 수 있으나, pointer는 아닙니다.)
var p *int
if p != nil {
// blahblah
}
함수에 포인터를 넘기기 위해서는 예시
func ChangeData(arg *Data) {
arg.value = 999
arg.data[100] = 999
}
별도의 변수를 선언하지 않고 바로 구조체를 포인터에 넣을 수도 있습니다.
// Create variable & Pass address
var data Data
var p *Data = &data
// Pass address directly
var p *Data = &Data{} // Use default value for member variable
// or use new keyword to create instance
var p *Data = new(Data)
Go 언어도 가비지 컬랙터가 있으며, 어떤 Pointer가 가르키지 않는 Instance는 데이터가 모여 청소된다.
func TestFunc() {
u := &User{}
u.Age = 30
fmt.Println(u)
}
Go 언어는 JVM, C와 달리 Go 언어가 내부적으로 검사 (탈출검사?)을 수행하여 메모리에 할당할지 결정
- 함수 내부에서만 사용한다면 Stack
- 함수 외부에서 사용될 수 있다면, Heap
에 정의된다.
func Newuser(name string, age int) *User {
var u = User {name, age}
return &u // 함수 외부에서 사용될 수 있기 때문에 Heap에 정의
}