GoLang Study - A Tour of Go
2021. 6. 3. 01:57ㆍWork/GoLang
728x90
반응형
변수
// 어디든
var i, j int = 1, 2
// 함수 안에서 만
k := 3
타입
*정수 값이 필요할 때 특정 이유가 아니라면 int를 사용
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8의 별칭
rune // int32의 별칭
// 유니코드에서 code point를 의미합니다.
float32 float64
complex64 complex128
For
// 1)
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
// 2)
sum := 1
for ; sum < 1000; {
sum += sum
}
// 3) while과 같음
sum := 1
for sum < 1000 {
sum += sum
}
// 4) 무한
for {
}
IF
// 1)
if x < 0 {
fmt.Println("Hi")
}
// 2) 조건문 수행 전에 수행될 짧은 구문 작성 가능
if v := math.Pow(x, n); v < lim{
fmt.Println(v)
}
// 3) if - else
if x < 0 {}
else {}
Switch
// 1)
os := true
switch os {
case true:
fmt.Println("HOHOHO")
case false:
fmt.Println("hee2929e929")
default:
fmt.Println("gekewqk")
}
// 2)
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
// freebsd, openbsd,
// plan9, windows...
fmt.Printf("%s.\n", os)
}
// 3) 조건 없는 Switch = switch true와 동일
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
Defer
// 1)
defer fmt.Println("world")
fmt.Println("hello")
//// 결과
hello
world
// 2)
defer switcher(true)
defer switcher(false)
fmt.Println("Hellooo")
func switcher(os bool){
switch os {
case true:
fmt.Println("HOHOHO")
case false:
fmt.Println("hee2929e929")
default:
fmt.Println("gekewqk")
}
}
//// 결과
Hellooo
hee2929e929
HOHOHO
// 3) 후입선출
fmt.Println("counting")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
//// 결과
counting
done
9
8
7
6
5
4
3
2
1
0
Pointers
// 1) 포인터는 현재 자신이 보고 있는 주소를 가리키는 것이지 자신의 주소를 바꾸는 것은 아니다!
i, j := 42, 2701 // i 주소 : 0xc00000a970, j 주소 : 0xc00000a978
var p *int // p를 int type 포인터로 할당
fmt.Println(p, &p)
p = &i // p값의 바라보는 주소를 i로 변경
fmt.Println(i, j, p, *p, &p)
*p = 11 // p값의 직접 접근하여 값 변경
fmt.Println(i, j, p, *p, &p)
p = &j // p값의 바라보는 주소를 j로 변경
fmt.Println(i, j, p, *p, &p)
*p = *p + 5 // p값의 직접 접근하여 값 변경
fmt.Println(i, j, p, *p, &p)
//// 결과
//// p 자신의 주소 값은 '0xc000006030'로 동일
<nil> 0xc000006030
42 2701 0xc00000a970 42 0xc000006030
11 2701 0xc00000a970 11 0xc000006030
11 2701 0xc00000a978 2701 0xc000006030
11 2706 0xc00000a978 2706 0xc000006030
// 2) runtime error!
i, j := 42, 2701
var p *int
fmt.Println(*p)
// panic: runtime error: invalid memory address or nil pointer dereference
// 3) nil
i, j := 42, 2701
var p *int
fmt.Println(p)
// 4) pointer 정리
i, j := 42, 2701
var p *int // p *int => int *p 즉, *p라는 int형 변수를 선언한 것으로 기억하면 편안
p = &i // 주소를 변경
fmt.Println(i, j, p, *p, &p) // 값이 변하진 않음
*p = j // 값을 변화 시킴
fmt.Println(i, j, p, *p, &p) // 주소가 변하진 않음
Struct
//
type Vertex struct {
X int
Y int
}
v := Vertex{1, 2}
ps := &v
v3 := XD_hub.Vertex{X: 1}
fmt.Println(v, v.X, v.Y, ps, *ps, ps.Y, ps.X, v3)
//// 결과
{1 2} 1 2 &{1 2} {1 2} 2 1 {1 0}
Arrays
//// Array
var a[2] int
a[1] = 10
b := [4]int {2,1}
fmt.Println(a, b)
//// 결과
[0 10] [2 1 0 0]
// Slices
b := [4]int {2,1}
var ww []int = b[0:2]
fmt.Println(ww)
//// 결과
[2 1]
# Slices are like references to arrays (배열을 참조하는 슬라이스)
b := [4]int {2,1}
var ww []int = b[0:2]
ww[0] = 2000
fmt.Println(b)
//// 결과
[2000 1 0 0]
// Slice literals (슬라이스 리터럴)
r := []int {3,4,5}
var r2 []int = []int {6,2,8}
st := []struct{
i int
s string
}{
{2, "sda"},
{5, "doooss"},
}
fmt.Println(r, r2, st)
//// 결과
[3 4 5] [6 2 8] [{2 sda} {5 doooss}]
// Slice defaults (슬라이스 기본 값)
s := []int{2, 3, 5, 7, 11, 13}
s = s[1:4]
fmt.Println(s)
s = s[:2] # s = s[0:2] 와 동일
fmt.Println(s)
s = s[1:] # s = s[1:2] 와 동일
fmt.Println(s)
s = s[:] # s = s[0:1] 와 동일, 현재 전체
fmt.Println(s)
//// 결과, ** 주의할점! : 슬라이스마다 결과를 다시 반영해서 적용한다.
[3 5 7]
[3 5]
[5]
[5]
// Slice length and capacity (슬라이스의 길이와 용량)
h := []int{2, 3, 5, 7}
h = h[:2]
fmt.Println(h, len(h), cap(h))
h = h[1:3]
fmt.Println(h, len(h), cap(h)) // 슬라이스 첫번째 인수를 늘리면, 용량이 줄어듭니다.
// h[0:4] -> 4 4 h[0:4] -> 4 4
// h[1:4] -> 3 3 h[0:3] -> 3 4
// h[2:4] -> 2 2 h[0:2] -> 2 4
//// 결과, len : 길이, cap : 용량
[2 3] 2 4
[3 5] 2 3
// Nil slices
var s []int
fmt.Println(s, len(s), cap(s))
if s == nil {
fmt.Println("nil!")
}
//// 결과
[] 0 0
nil!
// Creating a slice with make (make 함수로 슬라이스 만들기)
h := make([]int, 5)
fmt.Println(h)
b := make([]int, 0, 5) // len(b)=0, cap(b)=5
c := b[:2]
fmt.Println(c)
//// 결과
[0 0 0 0 0]
[0 0]
// Slices of slices (슬라이스의 슬라이스)
board := [][]string{
[]string{"-","-","-"},
[]string{"-","-","-"},
}
board[0][0] = "ㅇ"
board[1][0] = "ㅂ"
board[0][1] = "ㅁ"
board[1][1] = "X"
fmt.Println(board)
//// 결과
[[ㅇ ㅁ -] [ㅂ X -]]
// Appending to a slice (슬라이스에 요소 추가하기)
var s []int
s = append(s, 10)
fmt.Println(s)
// *고정된 배열에는 append 불가
// var eod[2] int
// eod = append(eod, 100) //// error!
//// 결과
[10]
728x90
반응형
'Work > GoLang' 카테고리의 다른 글
GoLang Study - VS Code Setting (0) | 2021.05.18 |
---|