기본 데이터 타입과 선언
func main() {
x := 20
fmt.Println(x)
x = 30
}
D:\go>go run hello.go
20
=> 마지막 x를 재정의 하고 사용하지 않았으나 ( 비효율적 코드) 잡아내지 못함.
(golangci-lint 는 가능)
Go는 유니코드 문자를 식별자로 허용
Go는 관용적으로 스네이크 표기법 사용하지 않음
상수: 모든 문자를 대문자, 각 단어는 밑줄로 구분(보통 다른 언어들)
함수 내에서는 짧은 변수 이름 선호
짧은 이름
int iScore = 10
String strName
약타입 언어들..(변수 이름에 type포함) Go는 X (Go는 강타입 언어.) => 더 짧은 변수 이름 사용하자.
복합 타입
1) 제로 값으로 선언: 배열의 크기와 배열 내 요소 타입 지정
package main
import "fmt"
func main() {
var x [3]int
fmt.Println(x)
}
D:\go>go run hello2.go
[0 0 0]
2) 배열 초깃값 지정: 배열 리터럴 사용
func main() {
var x [3]int // 데이터 타입
var y = [3]int{10, 20, 30} // array literal
fmt.Println(x)
fmt.Println(y)
fmt.Println([2]float32{2.1, 3.3})
}
D:\go>go run hello2.go
[0 0 0]
[10 20 30]
[2.1 3.3]
3) 희소 배열: 대부분의 요소가 0인 배열
func main() {
var x [3]int // 데이터 타입
var y = [3]int{10, 20, 30} // array literal
var z = [12]int{1, 5: 4, 6, 10: 100, 15} //n:3 n번쨰에 3
fmt.Println(x)
fmt.Println(y)
fmt.Println(z)
}
D:\go>go run hello2.go
[0 0 0]
[10 20 30]
[2.1 3.3]
[1 0 0 0 0 4 6 0 0 0 100 15]
4) 배열 크기 지정하지 않고: 배열 리터럴 필요
5) 다차원 배열: []의 개수가 차원 수
func main() {
var x [3]int // 데이터 타입
var y = [3]int{10, 20, 30} // array literal
var q = []int{10, 20, 30} //슬라이스
fmt.Println(x)
fmt.Println(y)
fmt.Println(q)
}
D:\go>go run hello2.go
[0 0 0]
[10 20 30]
[10 20 30]
2) 희소 슬라이스
희소 배열과 유사.
3) 다차원 슬라이스
var r = [][]int{{1, 2}, {4, 5, 6}}
4) 제로 슬라이스: 슬라이스 리터럴 없이 선언만 하는 것
- 슬라이스의 제로 값은 nil
- nil : 값의 부재(absence of value) 상태
- nil은 타입이 없음
5) 비어있는 슬라이스: 슬라이스 리터럴에 초깃값이 없는
func main() {
var x []int // zero slice
x = append(x, 10)
fmt.Println(x)
}
D:\go>go run hello2.go
[10]
func main() {
var x = []int{3, 4, 5}
x = append(x, 10)
fmt.Println(x)
}
D:\go>go run hello2.go
[3 4 5 10]
슬라이스 연산자(:)
슬라이스 연산자를 사용하면 복사본을 만들지 않고 메모리를 공유함
슬라이싱과 append를 함께 사용하면 혼란이 가중됨
하위 슬라이스의 수용력
= 원본 슬라이스의 수용력 - 하위 슬라이스 시작 오프셋
하위 슬라이스와 append를 아무 생각 없이 사용하면 혼란이 가중된다.
완전한 슬라이스 표현식
y := x[:2:2]
z := x[2:4:4]
문자열은 룬으로 이루어진 것은 아니다.
문자열은 바이트의 시퀀스이다.
문자열의 길이는 바이트 수
문자열에 슬라이스 연산 사용 가능
문자열은 바이트 슬라이스 또는 룬 슬라이스로 변환 가능
생성
1) nil 맵(제로 값 할당): map의 제로 값은 nil
2) 비어 있는 맵 리터럴: 비어 있는 맵 생성
3) 값이 있는 맵 리터럴
4) make() 함수로 생성
package main
import "fmt"
func main() {
m := map[string]int{
"Hello": 5,
"world": 0,
}
v, ok := m["Hello"]
fmt.Println(v, ok)
v, ok = m["world"] // 위에 이미 v, ok가 만들어져서 :=사용불가.
fmt.Println(v, ok)
v, ok = m["mj"]
fmt.Println(v, ok)
}
D:\go>go run hello2.go
5 true
0 true
0 false
true ; 해당 키가 맵에 존재한다.
한 번만 사용할 구조체
type 생략 -> 구조체 이름이 없다.
구조체 변수만 존재
주요 용도
기타
숫자에서 밑줄은 그냥 구분자. 0_0 ; 00
null + 연산 => null
예시 ) null + 1 = null
msb 0x1234 lsb