안녕하세요. 이제 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 mainimport "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 := 10var p *int
p = &a
*p = 20
fmt.Printf("a = %d\n", a)
이렇게 *p=20이렇게 할당하는데, 왜 위에서는 *arg.value = 999 이렇게 안하고, arg.value = 999 로 하는지...
Go수분들 부탁드립니다.ㅠㅠ
1번은 잘 모르겠고, 2번은 포인터 뒤에 인덱싱이나 메서드같은 연산이 붙을 경우엔 자동으로 역참조 해주는 것으로 알고 있어요.
1번은 키워드를 포인터 연산자 로 해서 구글링하면 C포인터 얘기로 주루룩 나올거고, 이야기는 켄 톰슨 할배한테 직접 듣는게 젤 좋을 듯 ㅇㅂㅇ 근데 C랑 다르게 포인터로 고민할 일이 별로 없지 않나여 ㅇㅂㅇ? 패키지 반환형이나 진짜로 필요한 몇몇 상황 때문이 아니면 무지성으로 걍 밸류 선언/사용해줘도 문제 없을건데 말이져 ㅇㅂㅇ