Go Language #3 more types - countingmars/countingmars.github.io GitHub Wiki
https://tour.golang.org/moretypes/1
Pointers
Go๋ ํฌ์ธํฐ ํ์
์ ์ ๊ณตํ๋ค.
ํฌ์ธํฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ์ง ๋ณ์์ด๋ค.
T ํ์
์ ๋ํ ํฌ์ธํฐ ํ์
์ *T์ด๋ค. ํฌ์ธํฐ ํ์
์ zero value๋ nil์ด๋ค.
var p *int
& ์ฐ์ฐ์๋ก ๋ณ์์ ๋ํ ํฌ์ธํฐ ๊ฐ(๋ฉ๋ชจ๋ฆฌ ์ฃผ์)์ ์์๋ผ ์ ์๋ค.
i := 42
p := &i
ํฌ์ธํฐ ๋ณ์๋ฅผ ํตํด ์ค์ ๋ณ์ ์ ๊ทผํ๊ณ ์ ํ๋ค๋ฉด * ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ผ.
i := 42
p := &i
*p = 21
์ด๋ฅผ dereferencing(์ญ์ฐธ์กฐ?) ํน์ indirecting(์ฐํ์ ๊ทผ?)์ด๋ผ๊ณ ํ๋ค. C์ธ์ด์ ๋ฌ๋ฆฌ Go๋ ํฌ์ธํฐ ์ฐ์ฐ์ ์ง์ํ์ง ์๋๋ค.
Structs
๊ตฌ์กฐ์ฒด(stuct)๋ ํ๋(๊ตฌ์กฐ์ฒด๊ฐ ๊ฐ์ง๋ ๋ณ์)์ ๋ฌถ์์ด๋ค.
type Vertex struct {
X int
Y int
}
func main() {
fmt.Println(Vertex{1, 2})
}
. ์ฐ์ฐ์๋ก ๊ตฌ์กฐ์ฒด์ ํ๋์ ์ ๊ทผ๊ฐ๋ฅํ๋ค.
v := Vertex{1, 2}
v.X = 3
fmt.Println(v.X)
pointers to structs
ํฌ์ธํฐ ๋ค์ ์จ์ด์๋ ๋ณ์์ ์ ๊ทผํ๊ธฐ ์ํด์๋ (*p) ํ์์ผ๋ก ์จ์ผํ๋ค. ๋ฐ๋ผ์ ๊ตฌ์กฐ์ฒด์ ํ๋์ ์ ๊ทผํ๋ ๋ฐฉ์์ ์ด๋ฐ ์์ธ๋ฐ (*p).X
๋๋ฌด ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์ p.X๋ก ๋ฐ๋ก ์ธ ์ ์๊ฒ ํธ์๋ฅผ ๋ด์คฌ๋ค.
p := &Vertex{1, 2}
fmt.Println(p.X)
Struct Literals
๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋ง์น json ์ฒ๋ผ ์ ๊ทผํ ์ ์๋ค.
v1 := Vertex{ X: 1, Y: 2 }
v2 := Vertex{ X: 1 } // Y๋ int์ ๋ํ zero value๊ฐ ํ ๋น๋๋ฏ๋ก 0์ด ๋๋ค.
V3 := Vertex{} // X, Y ๋๋ค 0์ด ๋๋ค.
Arrays
int ๋ฐฐ์ด์ ๋ง๋ค๊ณ ์ถ์ผ๋ฉด ์ด๋ฐ ์์ด๋ค.
var a = [10]int
ํ์
T์ ๋ํ ๋ฐฐ์ด์ [n]T๋ผ๋ ์๋ฏธ์ด๋ค.
๋ํ ๋ฐฐ์ด์ ์ฌ์ด์ฆ๋ ๋ฐฐ์ด์ ์ผ๋ถ์ด๋ฏ๋ก ๋ณ๊ฒฝ๋ ์ ์๋ค. ํ์ง๋ง Go๋ ์ ์ฉํ ๊ธฐ๋ฅ์ ๋ง์ด ์ ๊ณตํด์ค๋ค๊ณ ํ๋ ๊ธฐ๋ํด๋ณด์.
var names = [2]string { "john", "mars" }
Slices
Array๋ ๊ณ ์ ๋ ์ฌ์ด์ฆ๋ฅผ ๊ฐ์ง์ง๋ง, Slice๋ ๋์ ์ผ๋ก ์ฌ์ด์ฆ๋๋ ๋ฐฐ์ด์ ๋ํ ์ ์ฐํ ๋ทฐ(view)๋ผ๊ณ ํ๋ค.
var s []int
๋ฐฐ์ด์ ์ ์ธํ ๋๋ [n]type์ด์ง๋ง, ์ฌ๋ผ์ด์ค๋ฅผ ์ ์ธํ ๋๋ []type์ด๋ค.
primes := [6]int{2, 3, 5, 7, 11, 13}
var s []int = primes[1:4]
์ ์ฝ๋๋ primes ๋ฐฐ์ด์ 1๋ฒ์งธ ์์๋ถํฐ 4๋ฒ์งธ ์์๊น์ง(์ด 3๊ฐ) ์กฐํํ์ฌ s๋ผ๋ ์ฌ๋ผ์ด์ค๋ฅผ ์์ฑํ๊ณ ์๋ค.
Slices are like references to arrays
์ฌ๋ผ์ด์ค๋ ๋ฐฐ์ด์ ๋ํ ์ฐธ์กฐ์ผ ๋ฟ์ด๋ค. ๋ฐ๋ผ์ ์ฌ๋ผ์ด์ค์ ์์์ ์ ๊ทผํ์ฌ ๊ฐ์ ์์ ํ๋ฉด, ์ฌ์ค์ ๋ค์ ์จ์ด์๋ ๋ฐฐ์ด์ ๊ฐ์ ์์ ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
Slice literals
๋ฆฌํฐ๋ด์ ๋ํ ์ฌ๋ผ์ด์ค๋ ๊ฐ๋ฅํ๋ค.
s := []int{ 1, 2 }
Slice defaults
์ฌ๋ผ์ด์ค๋ฅผ ๋ง๋ค ๋, ์ธ๋ฑ์ค ์ง์ ์ ์๋ตํ ์๋ ์๋ค.
์ฌ๋ผ์ด์ค์ ์ฒซ๋ฒ์งธ ์ธ์์ ๋ํดํธ๋ 0์ด๊ณ , ๋๋ฒ์งธ ์ธ์์ ๋ํดํธ๋ ๊ทธ ๋ฐฐ์ด์ length์ด๋ค.
array := [5]int { 1, 2, 3, 4, 5 }
slice := array[:5]
slice := array[0:]
slice := array[:]
slice := array[0:5]
์์ ํํ์ ๋ชจ๋ ๋์ผํ ์๋ฏธ์ด๋ค.
Slice length and capacity
์ฌ๋ผ์ด์ค์ length๋ ์ฌ๋ผ์ด์ค์ ์์ดํ ๊ฐฏ์์ด๋ค. ์ฌ๋ผ์ด์ค์ capacity๋ ์ฌ๋ผ์ด์ค ๋ค์ ์จ์ด์๋ ๋ฐฐ์ด์ ์์ดํ ๊ฐฏ์์ด๋ค. ์ฌ๋ผ์ด์ค์ length๋ len(s)์ผ๋ก ์ ์ ์๊ณ , capacity๋ cap(s)์ผ๋ก ์ ์ ์๋ค.
https://tour.golang.org/moretypes/11
์ ์์ ์์ ์ด๋ป๊ฒ drop์ด ์ด๋ฃจ์ด์ง๋?
s := []int{2, 3, 5, 7, 11, 13}
s = s[:0] // len(s) = 0, cap(s) = 6
s = s[:4] // len(s) = 4, cap(s) = 6, cap์ด 6.
s = s[2:] // len(s) = 4, cap(s) = 4, cap์ด 4! ์ด๋ป๊ฒ ์์ ์์๋ค์ slice ํ์ ๋๋ง drop ๋๋?
nil slices
nil slice๋ cap(s), len(s)๊ฐ ๋ชจ๋ 0์ด๊ณ , array์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง์ง ์๋๋ค.
var s []int
if s == nil {
fmt.Println("nil slice!")
}
Creating a slice with make
make ํจ์๋ก๋ slice๋ฅผ ๋ง๋ค ์ ์๋ค. ์ด ๋ฐฉ์์ผ๋ก dynamically-sized ๋ฐฐ์ด์ ๋ง๋ค ์ ์๋ค.
make ํจ์๋ ๋น ๋ฐฐ์ด์ ๋ง๋ค๊ณ , ๊ทธ ๋ฐฐ์ด์ ์ฐธ์กฐํ๋ slice๋ฅผ ๋ฐํํ๋ค.
a := make([]int, 5) // len = 5 ์ง์
b := make([]int, 0, 5) // len = 0, cap = 5 ์ง์
Slices of slices
slice์ slice๋ ๋ญ๊น? ์ด์ฐจ์ slice๋ฅผ ์๋ฏธํ๋ค.
board := [][]string {
[]string { "_", "_", "_" },
[]string { "_", "_", "_" },
[]string { "_", "_", "_" },
}
board[0][0] = "X"
board[2][2] = "O"
for i := 0; i < len(board); i++ {
fmt.Println("%s", strings.Join(board[i], " "))
}
Appending to a slice
func append(s []T, vs ...T) []T
slice์ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ๊ณ ๊ทธ ๊ฒฐ๊ณผ slice๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค.
๋ง์ฝ slice๊ฐ ์ฐธ์กฐํ๋ array์ ๋ฒ์๋ฅผ ๋์ด์๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ์๋ก์ด array๋ฅผ ๋ง๋ค์ด์ ๋ฐํํด์ค๋ค. ํธํ์ง?
s = []int { 1, 2, }
s = append(s, 3)
s = append(s, 4, 5, 6, 7)
Range
for ๋ฐ๋ณต๋ฌธ์์์ range
๋ map์ด๋ slice๋ฅผ ์ํํ๋ค.
pow := []int { 1, 2, 4, 8, 16, 32 }
for i, v := range pow {
fmt.Printf("%d, %d\n", i, v)
}
i๋ slice์ ์ธ๋ฑ์ค, v๋ ํด๋น ์ธ๋ฑ์ค์ ๊ฐ์ด๋ค. (๋งต์ด๋ผ๋ฉด key์ value ๊ฒ ์ง?)
๋ง์ฝ value๊ฐ ๋ถํ์ํ๋ค๋ฉด , v
๋ฅผ ์๋ตํ๋ฉด ๋๋ค.
๋ง์ฝ index๊ฐ ๋ถํ์ํ๋ค๋ฉด _๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
for _, v := range pow { ... }
Maps
maps๋ key์ value๋ฅผ ์ฐ๊ฒฐ์์ผ์ค๋ค.
map์ zero value๋ nil์ด๊ณ , ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
makeํจ์๋ก ์ค๋น๋(ready for use) map์ ๋ง๋ค ์ ์๋ค.
type Vertex struct {
Lat, Lon float64
}
var m map[string]Vertex
func main() {
m = make(map[string]Vertex)
m["bell labs"] = Vertex { 40.68433, -74.39967, }
fmt.Println(m["bell labs"])
}
Map literals
var m map[string]Vertex {
"bell labs": Vertex { 40.68433, -74.39967 },
"google": Vertex { 37.42202, -122.08408 }
}
๋ง์ฝ map์ ๊ฐ์ด ์ ํํ ํน์ ํ์ ์ด๋ผ๋ฉด ์๋ตํ ์ ์๋ค.
var m map[string]Vertex {
"bell labs": { 40.68433, -74.39967 },
"google": { 37.42202, -122.08408 }
}
Mutating maps
delete ํจ์๋ก ์์๋ฅผ ์ญ์ ํ ์ ์๋ค.
m[key] = item
delete(m, key)
์กฐํ๋ ์ด๋ฐ ์์ผ๋ก ํ ์ ์๋ค.
item = m[key]
๋ง์ฝ key์ ๊ฐ์ด ์กด์ฌํ์ง ์๋๋ค๋ฉด zero value๊ฐ ๋ฐํ๋๋ค. ์กด์ฌ ์ฌ๋ถ๋ ๋๋ฒ์งธ ๋ฐํ๊ฐ์ boolean ๊ฐ์ผ๋ก ์ ์ ์๋ค.
item, ok = m[key]
if ok { fmt.Println(item) }
Function values
ํจ์๊ฐ ๊ฐ์ผ๋ก ์ทจ๊ธ๋๋ค๋ ๋ง์ ์๋ฏธ๋ ํจ์ ์์ฒด๊ฐ ํ๋ผ๋ฏธํฐ๋ ๋ฐํ๊ฐ์ด ๋ ์ ์๋ค๋ ์๋ฏธ์ด๋ค.
func compute(fn func(float64, float64) float64) float64 {
return fn(3, 4)
}
func main() {
adder := func(a, b float64) float64 {
return a + b
}
sum := compute(adder)
fmt.Println(sum)
}
Function closures
function value๊ฐ ํจ์ ์ธ๋ถ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ๊ฒฝ์ฐ, closure๊ฐ ๋๋ค.
func createAdder() func(int) int {
sum := 0
return func(v int) int {
sum += v
return sum
}
}
func main() {
add := createAdder()
add(1)
add(3)
}