✅ 포스트 목차 ✅
➡️ Go-Tour 여기서 공부합니다.
1. 더 많은 타임들 : struct와 slice, map
(1) 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)
}
// output : {1,2} &{1,2} {1,0} {0,0}
// 만약 p-> *p 였다면 ? ->{1,2}
(2) Arrays
var a[10] int -> 10개의 정수들의 배열
(3) Slices
a[low:high] -> low ~ high-1
슬라이는 어떤 데이터도 저장 불가, 그냥 표시하는 역할
a[0:10]
a[:10]
a[0:]
a[:]
모두 같은 의미
슬라이스의 길이(슬라이스가 포함하는 요소의 개수) : len(a)
슬라이스의 용량(슬라이스의 첫 번째 요소부터 계산하는 기본 배열의 요소의 개수) : cap(a)
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)
}
슬라이스의 zero value = nil
make함수로 슬라이스를 만들 수 있다. 동적 크기의 배열 생성.
a:=make([]int, 5) -> 길이가 5인 슬라이스
b:=make([]int,0,5) -> 길이는 0, 용량은 5
(4) Range
range는 인덱스와, 인덱스 값의 복사본을 리턴한다
var arr = []int {1,2,3,4,5}
for i,v := range arr{
fmt.Printf("%d = %d\n", i, v)
}
output :
0 = 1
1 = 2
2 = 3
3 = 4
4 = 5
만약 변수가 하나만 들어간다면, 인덱스를 리턴한다.
슬라이스 연습하기
Pic 을 구현해봅시다. 이것은 dy 슬라이스의 길이와 dx 슬라이스의 각 요소를 8 비트 부호 없는 정수로 반환해야 합니다. 이 프로그램을 실행하면, 이것은 grayscale (well, bluescale) 값으로 변환된 그림을 보여줍니다.
이미지의 선택은 여러분에게 달려 있습니다. 흥미로운 함수로 (x+y)/2 , x*y , 그리고 x^y 를 제공합니다.
(루프를 사용하여 [][]uint8 안에 각 []uint8 을 할당해야 합니다.)
(타입 간에 변환하려면 uint8(intValue) 을 사용하세요.)
package main
import "golang.org/x/tour/pic"
func Pic(dx, dy int) [][]uint8 {
im := make([][]uint8, dy)
for y := range im{
im[y] = make([]uint8,dx)
for x:= range im[y]{
im[y][x]=uint8((x+y)/2)
}
}
return im
}
func main() {
pic.Show(Pic)
}
(5) Maps
맵의 zero value = nil
m = make(map[string]Vertex)
맵의 리터럴 : 키가 필요하다
var m = map[string]Vertex{
"Bell Labs": Vertex{
40.68433, -74.39967,
},
"Google": Vertex{
37.42202, -122.08408,
},
}
요소 추가하거나 업데이트하기
m[key] = elem
요소 검색하기
elem = m[key]
요소 제거하기
delete(m,key)
두 개의 값을 할당하며 키가 존재하는지 테스트 할 수 있다
elem, ok = m[key]
if key is in m => ok = true ? false
if key is not in m : elem = 0
맵 연습하기
WordCount 를 구현해봅시다. 이것은 문자열 s 의 각 word 의 개수의 맵을 반환해야 합니다. wc.Test 함수는 제공된 함수를 테스트하고 성공 혹은 실패를 출력하는 함수입니다. strings.Fields가 도움이 될 수 있습니다.
strings.Fields = string을 분해해서 슬라이스로 리턴
package main
import (
"golang.org/x/tour/wc"
"strings"
)
func WordCount(s string) map[string]int {
wd := strings.Fields(s)
result := make(map[string]int)
for _, ch := range wd {
if result[ch] == 0 {
result[ch] = 1
} else {
result[ch] += 1
}
}
return result
}
func main() {
wc.Test(WordCount)
}