Tour of Go를 기반으로한 Go의 기본 내용입니다.
Import
- 한줄씩 써도되고, 하나로 묶을 수도 있다.(factored import)
package main
import (
"fmt"
"math"
)
func main() {
fmt.Printf("Now you have %g problems.\n", math.Sqrt(7))
}
함수
- param에서 변수 이름 뒤에 type이 온다.
- (Go 선언 Syntax 관련 번역)
package main
import "fmt"
func add(x int, y int) int {
return x + y
}
func main() {
fmt.Println(add(42, 13))
}
- 두 개 이상의 연속된 이름이 주어진 함수 매개변수가 같은 type일 때.
func add(x, y int) int {
return x + y
}
- 복수개의 결과를 반환할 경우
package main
import "fmt"
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("hello", "world")
fmt.Println(a, b)
}
package main
import "fmt"
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, _:= swap("hello", "world")
fmt.Println(a)
}
이름이 주어진(기명의) 반환 값
- 반환 값의 이름이 정해져야 할 경우는 그 이름이 반환 값의 의미를 설명하는 데에 사용되어야함.
- 인자가 없는 return문은 이름이 주어진 반환 값을 반환. (naked return)
- naked return문은 짧은 함수에서만 사용되어야하고, 그렇지 않으면 가독성이 안좋을 수 있음.
package main
import "fmt"
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
func main() {
fmt.Println(split(17))
}
변수
- var 문은 변수에 대한 목록을 선언. 마지막은 type이다.
- var문은 package나 함수 단에 존재할 수 있다.
package main
import "fmt"
var c, python, java bool
func main() {
var i int
fmt.Println(i, c, python, java)
}
변수 초기화
- 변수 선언은 한 변수 당 하나의 초깃값을 포함할 수 있다.
- 초깃값이 존재한다면, type은 생략 가능.(변수는 초깃값의 type을 취함)
package main
import "fmt"
var i, j int = 1, 2
func main() {
var c, python, java = true, false, "no!"
fmt.Println(i, j, c, python, java)
}
짧은 변수 선언
- 함수 내에서 := 라는 짧은 변수 선언은 암시적 type으로 var 선언 처럼 사용 가능
- 함수 밖은 불가.
package main
import "fmt"
func main() {
var i, j int = 1, 2
k := 3
c, python, java := true, false, "no!"
fmt.Println(i, j, k, c, python, java)
}
기본 자료형
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8의 별칭
rune // int32의 별칭
// 유니코드에서 code point를 의미합니다.
float32 float64
complex64 complex128
- int와 uintptr type은 보통 32bit 시스템에서는 32bit, 64bit 시스템에서는 64bit의 길이.
- 정수 값이 필요할 때에는 특정한 이유로 크기를 정해야하거나 unsigned 정수 type을 사용해야하는게 아니라면 int를 사용해야함.
package main
import (
"fmt"
"math/cmplx"
)
var (
ToBe bool = false
MaxInt uint64 = 1<<64 - 1
z complex128 = cmplx.Sqrt(-5 + 12i)
)
func main() {
fmt.Printf("Type: %T Value: %v\n", ToBe, ToBe)
fmt.Printf("Type: %T Value: %v\n", MaxInt, MaxInt)
fmt.Printf("Type: %T Value: %v\n", z, z)
}
Zero values
- 명시적인 초깃값 없이 선언된 변수는 그것의 zero value로 초기화됨.
- 숫자 type에는 0
- boolean type에는 false
- string에는 "" (빈 문자열)
Type 변환
T(v)는 v라는 값을 T type으로 변환시켜줌.
var i int = 42
var f float64 = float64(i)
var u uint = uint(f)
간단한 버전
i := 42
f := float64(i)
u := uint(f)
- C와 달리 Go는 다른 type의 요소들 간의 할당에는 명시적인 변환을 필요로함.
package main
import (
"fmt"
"math"
)
func main() {
var x, y int = 3, 4
var f float64 = math.Sqrt(float64(x*x + y*y))
var z uint = uint(f)
fmt.Println(x, y, z)
}
Inference type
:= 혹은 var = 표현을 이용해 명시적인 type을 정의하지 않고 변수를 선언할 때, 그 변수 type은 오른 편에 있는 값으로부터 유추
- 변수 선언의 오른쪽에 무언가 적힐 때, 새로운 변수는 그것과 같은 type이 됨.
var i int
j := i // j 는 int
- 오른편에 type이 정해지지 않은 숫자 상수가 올 때, 새 변수는 그 상수의 정확도에 따라 int 혹은 float64, complex128이 됩니다.
i := 42 // int
f := 3.142 // float64
g := 0.867 + 0.5i // complex128
상수
- 상수는 변수처럼 선언되지만 const 키워드로 선언.
- 상수는 character 혹은 string, boolean, 숫자 값이 될 수 있음.
- 상수는 := 를 통해 선언 불가.
package main
import "fmt"
const Pi = 3.14
func main() {
const World = "世界"
fmt.Println("Hello", World)
fmt.Println("Happy", Pi, "Day")
const Truth = true
fmt.Println("Go rules?", Truth)
}
숫자형 상수
- 숫자형 상수는 매우 정확한 값.
- type이 정해지지 않은 상수는 그것의 문맥에서 필요한 type을 취함.
package main
import "fmt"
const (
// Create a huge number by shifting a 1 bit left 100 places.
// In other words, the binary number that is 1 followed by 100 zeroes.
Big = 1 << 100
// Shift it right again 99 places, so we end up with 1<<1, or 2.
Small = Big >> 99
)
func needInt(x int) int { return x*10 + 1 }
func needFloat(x float64) float64 {
return x * 0.1
}
func main() {
fmt.Println(needInt(Small))
fmt.Println(needFloat(Small))
fmt.Println(needFloat(Big))
//fmt.Println(needInt(Big))//int는 최대 64-bit 혹은 더 작은 상수 저장 가능.
}
'Language > Go' 카테고리의 다른 글
[기초] Go 기초 정리 - 4 (Method) (0) | 2022.07.05 |
---|---|
구조체를 포함하는 구조체 (0) | 2022.07.04 |
[기초] Go 기초 정리 - 3 (Pointer, Struct, Array, Slice, Range, Map, Function value, Function Closure) (0) | 2022.06.26 |
[기초] Slice의 사용과 내부 작동 방식 (0) | 2022.06.23 |
[기초] Go 기초 정리 - 2 (For, If, Switch, Defer) (0) | 2022.06.15 |