안녕하세요. 이제 Go언어 막 배우기 시작한 고린이 입니다..


후 포인터 개념이 아직 익숙하지가 않네요.

공부는 Tucker 책 사서 그걸로 예제 보는중입니다.


a := 10

var p *int 

p = &a


이렇게 하면, p에는 정수 변수인 a의 주소가 들어가고, *p는 주소p가 가리키는 곳의 데이터(즉 여기서는 a의 값인 10)이 되는거는 이해했습니다.

결국은 p는 주소가 된다 이건데...


질문1: 선언을 왜 var p *int 로 하나요. p가 *int라는건데.. var p &int로 해야 의미가 맞지 않나요?

(Go만든 사람한테 따져야하는건 알긴 알겠는데 이거 예전 C부터 이랬던거 같아서 왜 이렇게 했을까 이야기좀 듣고 싶어가...)


그 다음은 tucker책 예제인데,

package main

import "fmt"

type Data struct {
value int
data [200]int
}

func ChangeData(arg *Data) {
arg.value = 999
arg.data[100] = 999
}

func main() {
var data Data
ChangeData(&data)

fmt.Printf("value = %d\n", data.value)
fmt.Printf("data[100] = %d\n", data.data[100])
}


여기서 보면 중간에

func ChangeData(arg *Data) {

   arg.value = 999

   arg.data[100] = 999

}


여기에서요, 결국은 arg라는 변수에 Data의 포인터가 들어가거든요? 메인에서 보면 &data로 주소값을 넘겨주기도 하고요.

그런데 ChangeData함수 안에 보면,

arg.value = 999

arg.data[100] = 999

로 쓰인단 말이죠? 마치 arg가 Data구조체인것처럼요. 


질문2

사실은 arg는 구조체의 포인터 아닌가요?

왜 

*arg.value = 999

*arg.data[100] = 999

처럼 안쓰는건지...

너무너무 헷갈립니다...


만약 정수 예제라면,

a := 10
var p *int
p = &a
*p = 20
fmt.Printf("a = %d\n", a)

이렇게 *p=20이렇게 할당하는데, 왜 위에서는 *arg.value = 999 이렇게 안하고, arg.value = 999 로 하는지...



Go수분들 부탁드립니다.ㅠㅠ