ํด๋น๊ธ์ ์๋ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๊ณต๋ถํ ๋ด์ฉ๋ค์ ์ ๋ฆฌํ ๊ธ ์ ๋๋ค.
Go๋ฅผ ํฅํ ์ฌํ
go-tour-ko.appspot.com
Pointers
package main
import "fmt"
func main() {
i, j := 42, 2701
p := &i // point to i
fmt.Println(*p) // read i through the pointer
*p = 21 // set i through the pointer
fmt.Println(i) // see the new value of i
p = &j // point to j
*p = *p / 37 // divide j through the pointer
fmt.Println(j) // see the new value of j
}
c์ธ์ด์ ํฌ์ธํธ์ ์์ ํ ๋๊ฐ์ ํ์์ผ๋ก ๋์ํ๊ณ ์ฌ์ฉํ ์ ์๋ค.
Structs
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main() {
fmt.Println(Vertex{1, 2})
}
๊ตฌ์กฐ์ฒด ์ญ์ c์ธ์ด์ ๊ตฌ์กฐ์ฒด์ ๋์ผํ๊ณ ๋์ํ๊ณ ์ฌ์ฉ ๊ฐ๋ฅ
์ด๊ธฐ๊ฐ์ X = 1, Y = 2๋ก ๋ฃ๊ฒ ๋ค๋ ์๋ฏธ
๋ฌธ๋ฒ์ด ๋น์ทํด์ ํธํ๋ค ใ ใ
Struct Fields
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main() {
v := Vertex{1, 2}
fmt.Println(v.X)
v.X = 4
fmt.Println(v.X)
}
๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ธํ ๊ฒฝ์ฐ
v := Vertex{1, 2} ํ์์ผ๋ก ์ด๊ธฐ ๊ฐ์ ๋ฃ์ด์ฃผ๊ฑฐ๋
v := Vertex{} ํ์์ผ๋ก ์ ์ธ์ ํด์ค์ผ ์ฌ์ฉํ ์ ์๋ค.
๋ฌผ๋ก ๊ตฌ์กฐ์ฒด์์ ๋ณ์๋ค๋ ๊ฐ์ ์์ ํ ์ ์๋ค.
Pointers to structs
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main() {
v := Vertex{1, 2}
p := &v
p.X = 1e9
fmt.Println(v)
}
ํฌ์ธํฐ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
๋น์ฐํ ์ด์ผ๊ธฐ.
Struct Literals
package main
import "fmt"
type Vertex struct {
X, Y int
}
var (
v1 = Vertex{1, 2} // has type Vertex
v2 = Vertex{X: 1} // Y:0 is implicit
v3 = Vertex{} // X:0 and Y:0
p = &Vertex{1, 2} // has type *Vertex
)
func main() {
fmt.Println(v1, p, v2, v3)
}
v1 : ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ผ๋ก x์ y๊ฐ์ ๋ชจ๋ ๋ฃ์ด์ค ๊ฒฝ์ฐ.
v2 : x์ ๊ฐ๋ง 1์ด๋ผ๊ณ ์ ์ธ์ ํด์ฃผ๊ณ y์ ๊ฐ์ ์ถ๊ฐ์ ์ผ๋ก ๊ฑด๋ค์ฌ์ฃผ์ง์์์ผ๋, y๋ default์ธ 0์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
v3 : ์๋ฌด๊ฒ๋ ๋ช ์ํด์ฃผ์ง์์ ๊ฒฝ์ฐ์๋ ๋ชจ๋ default์ธ 0์ด ๋ค์ด๊ฐ๋ค.
p : p์ ๊ฒฝ์ฐ์๋ ํฌ์ธํฐ ๊ฐ์ผ๋ก ์ฃผ์๊ฐ์ ๋ฃ์ด์ค ๊ฒฝ์ฐ์ด๋ค. ๊ทธ๋์ ์ถ๋ ฅ์ ํด๋ณด๋ฉด & ์ฃผ์๊ฐ ํ์๊ฐ ๋ถ์ด์ ๋์ค๊ฒ ๋๋ค.
Arrays
package main
import "fmt"
func main() {
var a [2]string
a[0] = "Hello"
a[1] = "World"
fmt.Println(a[0], a[1])
fmt.Println(a)
primes := [6]int{2, 3, 5, 7, 11, 13}
fmt.Println(primes)
}
๊ธฐ๋ณธ์ ์ธ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ์์ ๋ฑ์ ๋ณด์ฌ์ค๋ค.
๋ฐฐ์ด์ ๊ธธ์ด์ ๊ฒฝ์ฐ์๋ ํ์ ์ ์ผ๋ถ๋ผ์ ์กฐ์ ํ๊ฑฐ๋ ๋ฐ๊ฟ ์ ์๋ค! ๊ณ ์ ๋ ๊ฐ
c์ธ์ด์ ๋ค๋ฅธ์ ์ด ์์ด์ ๋๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅ.
Slices
package main
import "fmt"
func main() {
primes := [6]int{2, 3, 5, 7, 11, 13}
var s []int = primes[1:4]
fmt.Println(s)
}
๋ฐฐ์ด๊ณผ๋ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ์ ๋์ ์ผ๋ก ๊ฐ์ ์ฌ์ฉํ ์ ์๋ค.
์ํ๋ฉด ๊ฐ์ ์ถ๊ฐํ๊ฑฐ๋ ์ง์ฐ๋ ํ์์ผ๋ก ๊ธธ์ด๋ฅผ ์กฐ์ ํด๊ฐ๋ฉฐ ์ฌ์ฉํ ์ ์๋ค.
go์ ๊ฒฝ์ฐ์๋ ๋ฐฐ์ด๋ณด๋ค๋ ์ฌ๋ผ์ด์ค๋ฅผ ์กฐ๊ธ ๋ ํํ๊ณ ์์ฃผ ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
Slices are like references to arrays
package main
import "fmt"
func main() {
names := [4]string{
"John",
"Paul",
"George",
"Ringo",
}
fmt.Println(names)
a := names[0:2]
b := names[1:3]
fmt.Println(a, b)
b[0] = "XXX"
names[0] = "hello"
fmt.Println(a, b)
fmt.Println(names)
}
์ฌ๋ผ์ด์ค๊ฐ ๋ฐฐ์ด์ ์ฐธ์กฐํ์ฌ ์์ฑ์ด ๋ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ๊ฐ๋ค์ด ์๋ก ๊ณต์ ๋๊ณ
์ฌ๋ผ์ด์ค์ ์์๋ฅผ ์์ ํ๊ฑฐ๋ ๋ฐฐ์ด์ ๊ฐ์ ์์ ํ๋ฉด
๊ทธ ๊ฐ์ด ์ ์ฒด์๋ ์ํฅ์ ์ฃผ์ด ์ฐธ์กฐํ๋ ๋ชจ๋ ๊ฐ๋ค์ด ๋ฐ๋๊ฒ ๋๋ค.
Slice literals
package main
import "fmt"
func main() {
q := []int{2, 3, 5, 7, 11, 13}
fmt.Println(q)
r := []bool{true, false, true, true, false, true}
fmt.Println(r)
s := []struct {
i int
b bool
}{
{2, true},
{3, false},
{5, true},
{7, true},
{11, false},
{13, true},
}
fmt.Println(s)
}
์ฌ๋ผ์ด์ค ๋ฆฌํฐ๋ด์ ๊ธธ์ด๊ฐ ์๋ ๋ฐฐ์ด ๋ฆฌํฐ๋ด์ด๋ผ๊ณ ํ๋ค.
์์ ๊ฐ์ด [] ํ์์ผ๋ก ๊ฐ์ ์ฃผ์ง์์ผ๋ฉด ์ํ๋ ๋งํผ ์ ์ธ์ด ๊ฐ๋ฅํ๊ณ
์ฌ๋ผ์ด์ค๋ฅผ ๋ง๋ค ๋ struct๋ฅผ ์ฌ์ฉํ๋ฉด ๊ตฌ์กฐ์ฒด์ ๊ฐ์ด ํ๋ฒ์ ์ฌ๋ฌ๊ฐ์ ๋ค๋ฅธ ํ์ ์ธ์๋ฅผ ๋ฃ์ ํ์์ฒ๋ผ ๊ตฌํํ ์ ์๋ค.
์ง์ง ํธํ๊ฒ ๋ค๋ผ๊ณ ๋๋ ๋ถ๋ถ
๋ฉ๋ชจ๋ฆฌ ๋ถ๋ถ์ด๋ ์๋๋ถ๋ถ์์๋ ์ด๋ป๊ฒ ๋์๊ฐ์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ผ๋, ํธํจ ํ๋์ ๋๋ ์ธ์ !
Slice defaults
package main
import "fmt"
func main() {
s := []int{2, 3, 5, 7, 11, 13}
s = s[1:4]
fmt.Println(s)
s = s[:2]
fmt.Println(s)
s = s[1:]
fmt.Println(s)
}
์ฌ๋ผ์ด์ค๋ฅผ ์ถ๋ ฅํ๊ณ ๊ฐ์ ์์ ํ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ๋ค ์ ๋ฆฌ
์ํ์ด๋ ํํ์ ๋ฐ๋ผ์ ์ด๋ป๊ฒ ๊ฐ์ ์ค ์ ์๊ณ ์์ ํ ์ ์๋์ง
python์ฒ๋ผ ๊ฐ์ ํ์์ผ๋ก ๋์์ ํ๋ค.
์ํ์ด๋ ํํ์ ๋น์๋๋ ๊ฒฝ์ฐ ๊ฐ์ด ์ฒ์์ด๋ ๋๊น์ง๋ผ๋ ์์ผ๋ก ํด์์ด ๋๊ฒ ๋๋ค.
์ํ์ ๊ฒฝ์ฐ ์ํ ๊ฐ๊น์ง ๋ด๊ธฐ๋ ๊ฒ์ด ์๋ ์ํ -1 ๊น์ง ๋ด๊ธฐ๊ฐ ๋๋ค.
Slice length and capacity
package main
import "fmt"
func main() {
s := []int{2, 3, 5, 7, 11, 13}
printSlice(s)
// Slice the slice to give it zero length.
s = s[:0]
printSlice(s)
// Extend its length.
s = s[:4]
printSlice(s)
// Drop its first two values.
s = s[2:]
printSlice(s)
}
func printSlice(s []int) {
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}
len : ๋ฌธ์๊ฐ ๋ช๊ฐ ๋ด๊ฒจ ์๋์ง ๋ฐํํด์ฃผ๋ ์ฌ๋ผ์ด์ค์ ๊ธธ์ด ( ๋ฌธ์๊ฐ ๋ด๊ฒจ์๋ ๊ฐ์ )
cap : ์ฌ๋ผ์ด์ค์ ์ฉ๋ ( malloc ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ ๋ฒ์ ๊ณต๊ฐ )
len์ ๊ธธ์ด๊ฐ cap๋ฅผ ๋์ด์ ๊ฒฝ์ฐ์๋ cap๋ 2๋ฐฐ์ ๊ฐ์ผ๋ก ์ฆ๊ฐ ๋๋ค.
ex) 6.. 12.. 24
์ค๊ฐ์ s[:0] ํ์์ผ๋ก ๊ฐ์ ๋ชจ๋ ๋ ๋ ค๋ s[:4]๋ก ๋ค์ ์ ๊ทผํ ์ ์๋ ์ด์ ๋
cap์ด๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์ ์ด์ ์ ํ ๋น์ด๋ ๊ฐ์ ๊ธฐ์ตํ๋ค๊ณ ํ๋ค. ๊ทธ๋์ len์ ๋ ๋ ค๋ฒ๋ฆฌ๊ณ ๋ค์ ์ฌ ์ ์ธํด๋ ๊ธฐ์กด ๊ฐ์ด ์ ์ง๋ ์ ์๋ค.
๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ์ ์ต๋ํ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์ ์ด๋ป๊ฒ ํด์ผํ๋์ง ๊ณ ๋ฏผํ ๊ฒฐ๊ณผ๋ฌผ์ด๋ผ๊ณ ์๊ฐํ๋ค
cap ์์ฒด๋ฅผ ํฌ๊ฒ ์ค๋ฒ๋ ธ๋ค๋ฉด ์ธ๋ฐ์์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฐ๊ฒ๋๊ธฐ ๋๋ฌธ์ ํจ์จ์ฑ์ ์๊ฐํด์ ๊ทธ๋ ๊ฒ ์์ฑํ๋ค๊ณ ์๊ฐ.
Nil slices
package main
import "fmt"
func main() {
var s []int
fmt.Println(s, len(s), cap(s))
if s == nil {
fmt.Println("nil!")
}
}
์๋ฌด๋ฐ ๊ฐ๋ ํ ๋นํ์ง์์ ๊ฒฝ์ฐ์๋ nil ์ด๋ค.
make๋ฅผ ์ฌ์ฉํด์ ํ ๋นํ๊ฑฐ๋ ๊ฐ์ ๋ฃ์ง์์ ๊ฒฝ์ฐ์๋ ๊ณต๊ฐ ์ฐจ์ง X
Creating a slice with make
package main
import "fmt"
func main() {
a := make([]int, 5)
printSlice("a", a)
b := make([]int, 0, 5)
printSlice("b", b)
c := b[:2]
printSlice("c", c)
d := c[2:5]
printSlice("d", d)
}
func printSlice(s string, x []int) {
fmt.Printf("%s len=%d cap=%d %v\n",
s, len(x), cap(x), x)
}
makeํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ์ ์ธ ํํ ๋ฆฌ์ผ
len์ ๋ํ ๊ธธ์ด๋ฅผ ์ฃผ์ง์๊ฒ ๋๋ฉด ๋ชจ๋ 0์ผ๋ก ๋ค์ด๊ฐ๊ฒ ๋๊ณ
len์ ๋ํ ๊ธธ์ด๋ฅผ ์ฃผ๊ฒ ๋๋ฉด ์์ ๊ฐ์ด cap๋ 5์ธ๋ฐ len์ 0์ธ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
Slices of slices
package main
import (
"fmt"
"strings"
)
func main() {
// Create a tic-tac-toe board.
board := [][]string{
[]string{"_", "_", "_"},
[]string{"_", "_", "_"},
[]string{"_", "_", "_"},
}
// The players take turns.
board[0][0] = "X"
board[2][2] = "O"
board[1][2] = "X"
board[1][0] = "O"
board[0][2] = "X"
for i := 0; i < len(board); i++ {
fmt.Printf("%s\n", strings.Join(board[i], " "))
}
}
์ฌ๋ผ์ด์ค์๋ intํ๋ง ๋ด์ ์ ์๋ ๊ฒ์ด ์๋๋ผ string float ๋ฑ๋ฑ ๋ค์ํ ํ์ ๋ค์ ๋ด์ ์ ์๋ค.
+ 2์ฐจ์ ์ฌ๋ผ์ด์ค ์ ์ธ ๋ฐฉ๋ฒ
Appending to a slice
package main
import "fmt"
func main() {
var s []int
printSlice(s)
// append works on nil slices.
s = append(s, 0)
printSlice(s)
// The slice grows as needed.
s = append(s, 1)
printSlice(s)
// We can add more than one element at a time.
s = append(s, 2, 3, 4)
printSlice(s)
}
func printSlice(s []int) {
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}
append๋ฅผ ํตํด์ ์ฌ๋ผ์ด์ค์ ๊ฐ์ ์ถ๊ฐ ํ ์ ์๋ค.
"append ์ ์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ s ๋ ์ฌ๋ผ์ด์ค์ ํ์ T ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง T ๊ฐ๋ค์ ์ฌ๋ผ์ด์ค์ ์ถ๊ฐํ ๊ฐ๋ค์ ๋๋ค."
Range
package main
import "fmt"
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
func main() {
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
}
range ์ฌ๋ผ์ด์ค์ ์์๋ฅผ ์ํํ ์ ์๋ค.
python์ range์ ๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
ํํ ์งฑ ์ข์
Range continued
package main
import "fmt"
func main() {
pow := make([]int, 10)
for i := range pow {
pow[i] = 1 << uint(i) // == 2**i
}
for _, value := range pow {
fmt.Printf("%d\n", value)
}
}
๊ธฐ๋ณธ์ ์ผ๋ก
for i, value := range pow
ํ์์ผ๋ก ์ธ๋ฑ์ค์ value ๊ฐ์ ๋ฐ์์ ์ฌ์ฉํ ์ ์์ง๋ง
for _, value := range pow
ํ์์ผ๋ก ํ๋ฉด ๊ฐ์ ๊ฑด๋ ๋ธ ์ ์๋ค.
for i := range pow
์ธ๋ฑ์ค๊ฐ ์ฐ์ ์์๋ก ๋์ด i์๋ ์ธ๋ฑ์ค๊ฐ ๋ด๊ธด๋ค.
Exercise: Slices
package main
import "golang.org/x/tour/pic"
func Pic(dx, dy int) [][]uint8 {
ss := make([][]uint8, dy)
for y := 0; y < dy; y++ {
s := make([]uint8, dx)
for x := 0; x < dx; x++ {
s[x] = uint8((x + y) / 2)
// s[x] = uint8(x * y)
// s[x] = uint8(x ^ y)
}
ss[y] = s
}
return ss
}
func main() {
pic.Show(Pic)
}
pic.Show๋ผ๋ ํจ์๋ฅผ ์คํํ๋ฉด ์์๊ฐ์ด ๊ฐ์ ๋ฐ๋ผ์ ๊ทธ๋ฆผ์ ๊ทธ๋ ค์ค๋ค.
slice๋ฅผ ์ค์ ๋ก ์ฌ์ฉํด๋ด๋ผ? ๋ผ๋ ์๋ฏธ
Maps
package main
import "fmt"
type Vertex struct {
Lat, Long 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 : key๋ฅผ ๊ฐ์ง๊ณ ํด๋นํ๋ value๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋ ํด์ํ ์ด๋ธ์ ๊ตฌํํ ๊ตฌ์กฐ
'programming language > Go' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Go] go-tour _ flowcontrol (0) | 2021.09.25 |
---|---|
[Go] go-tour _ basics [17/17] (1) | 2021.09.23 |
[Go] go-tour _ basics [9/17] (2) | 2021.09.22 |
[Go] go-tour _ welcome (0) | 2021.09.21 |
[Go] hello world ์ถ๋ ฅ ํด์ํ๊ธฐ (0) | 2021.09.19 |