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)
}