Pointer
Go์๋ ํฌ์ธํฐ๊ฐ ์์ต๋๋ค. ํฌ์ธํฐ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ์ผ๋ก ๊ฐ๋ ํ์ ๋๋๋ค.๋ค์๊ณผ ๊ฐ์ด ์ ์ธํ ์ ์์ต๋๋ค.
var ๋ณ์๋ช *ํ์ var p *int
์ด๋ ๊ฒ ์ ์ธํ ํฌ์ธํฐ ๋ณ์๋ ๋ค๋ฅธ ๋ณ์์ ์ฃผ์๊ฐ์ ์ ์ฅํ ์ ์์ผ๋ฉฐ ๋ค๋ฅธ ๋ณ์์ ์ฃผ์๊ฐ์ &์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผํ ์ ์์ต๋๋ค.
import "fmt"
func main() {
a := 1
var p *int
p = &a
*p = 20
fmt.Println("p๋ pointer ์ฆ ๋ณ์ a์ ์ฃผ์๋ฅผ ๋ณด๊ด: ", p)
fmt.Println("*p๋ ์ ์ 20์ ๋ณด๊ด: ", *p)
}
p๋ pointer ์ฆ ๋ณ์ a์ ์ฃผ์๋ฅผ ๋ณด๊ด: 0xc0000a2040 *p๋ ์ ์ 20์ ๋ณด๊ด: 20
์ ์ฝ๋์์ p๋ pointer์ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก &a์ ๊ฒฐ๊ณผ์ธ a์ ์ฃผ์๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ๋ฐ๋ฉด์ *p๋ pointer๊ฐ ์๋๋ฏ๋ก ์ผ๋ฐ์ ์ธ ๊ฐ์ ๋ณด๊ดํฉ๋๋ค. ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ฌ ๋ค์์ ์คํํด ๋ด ๋๋ค.
func main() {
a := 1
var p *int
p = &a
*p = &a
fmt.Println("p๋ pointer ์ฆ ๋ณ์ a์ ์ฃผ์๋ฅผ ๋ณด๊ด: ", p)
fmt.Println("*p๋ ์ ์ 20์ ๋ณด๊ด: ", *p)
}
# command-line-arguments go_project\const.go:9:7: cannot use &a (value of type *int) as int value in assignment
์ฆ, *p๋ ํฌ์ธํฐ๊ฐ ์๋๋ฏ๋ก ์ฃผ์๋ฅผ ๋ณด๊ดํ ์ ์๋ค๋ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
package main
import "fmt"
func main() {
var a int = 10
var p *int
fmt.Println(a)//a๊ฐ ์ถ๋ ฅ
p = &a
fmt.Printf("%v\n", &a) //%v ์ธ์คํด์ค ์ถ๋ ฅ, a์ ์ฃผ์
fmt.Printf("%v\n", p)//a์ ์ฃผ์
*p = 20
fmt.Println(a) //a์ ๊ฐ
fmt.Println(*p)//a์ ๊ฐ์ด *p์ ์ ์ฅ
}
10 0xc00000a0e8 0xc00000a0e8 20 20
์ธ์คํด์ค(instance): ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋ ๋ฐ์ดํฐ์ ์ค์ฒด
nil: ํฌ์ธํฐ์ ๊ธฐ๋ณธ๊ฐ
๋ณ์์ ์ด๊ธฐํ๊ฐ ํ ๋น๋์ง ์์ ๊ฒฝ์ฐ ๊ฐ ํ์ ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํ๋ฉ๋๋ค. ํฌ์ธํฐ ๋ณ์ ์ญ์ ๊ฐ์ ๋ฐฉ์์ด๋ฉฐ ๊ทธ ๊ธฐ๋ณธ๊ฐ์ nil ์ ๋๋ค.
import "fmt"
func main() {
var p *int
fmt.Println(p)
}
<nil>
๋๊ธ
๋๊ธ ์ฐ๊ธฐ