GoTour사이트에서 Go 언어를 학습하고 있고, 이 내용을 정리하려 합니다.
패키와 변수, 함수
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println("My favorite number is", rand.Intn(10))
}
패키지
- Go 프로그램은 패키지로 구성되어 있다.
- 모든 프로그램은 main 패키지에서 실행을 시작한다.
- 즉 main 패키지의 main 함수를 호출하여 프로그램이 시작된다.
Import
- import를 괄호로 그룹 짓는 방식을
factored import
문이라고 한다. - 아래와 같은 방식으로도 import할 수 있다.
import "fmt"
import "math/rand"
- 하지만 위 방식보다
factored import
문을 사용하는 것이 더 좋은 스타일이다.
Export
import "math"
func main() {
fmt.Println(math.pi) # error
fmt.Println(math.Pi)
}
- Go에서는 대문자로 시작하는 이름이 export 된다.
- 예를 들어 math 패키지에서 Pi는 export 되지만 pi는 대문자로 시작하지 않으므로 export되지 않는다.
Function
package main
import "fmt"
func add(x int, y int) int {
return x + y
}
func main() {
fmt.Println(add(42, 13))
}
- 함수는 0개 혹은 그보다 많은 인자를 받을 수 있다.
- 예시에서 add 함수는 2개의
int
형 매개변수를 이용한다. - 변수 이름 뒤 type이 온다는 것을 명심하자.
func add(x, y int) int {
return x + y
}
- 두 개 이상의 연속된 이름이 주어진 함수 매개변수가 같은 type일 때, 마지막 변수를 제외한 변수들의 type을 생략할 수 있다.
여러개의 값 반환
package main
import "fmt"
func swap(x, y string) (string, string) {
return x, y
}
func main() {
a, b := swap("hello", "world")
fmt.Println(a, b)
}
result
hello world
- 한 함수는 몇개의 결과든 반환할 수 있다.
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(10))
}
result
4 6
- 함수의 반환값은 이름이 정해질 수 도 있다. → (x, y int)
- 이러한 이름들은 반환값의 의미를 설명하는데 사용되어야 한다.
- 인자가 없는
return
은 이름이 주어진 반환 값을 반환한다. - 이를 naked return이라고 한다.
변수
package main
import "fmt"
var c, python, java bool
func main() {
var i int
fmt.Println(i, c, python, java)
}
result
0 false false false
- var 문은 변수에 대한 목록을 선언한다.
- 함수와 동일하게 마지막은 type을 정의한다.
- var 문은 package나 함수단에 존재할 수 있다.
- 명시적 초깃값 없이 선언된 변수는 해당 자료형의 zero value가 주어진다.
- 숫자는 0
- boolean에는 false
- string에는 “”
변수 초기화
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)
}
result
1 2 true false no!
- 변수 선언은 한 변수당 하나의 초기값을 포함할 수 있다.
- 만약 초깃값이 존재한다면, type은 생략될 수 있다.
짧은 변수 선언
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)
}
result
1 2 3 true false no!
- 함수 내에서 := 라는 짧은 변수 선언을 사용할 수 있다.
- 함수 밖에서는 모든 선언이 키워드(var, func, etc)로 시작하므로 :=구문은 사용하지 못한다.
기본 자료형
Go의 자료형은 Boolean, 정수, 실수, 복소수, 문자열, 기타(byte, rune) 타입이 있다.
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)
}
result
Type: bool Value: false
Type: uint64 Value: 18446744073709551615
Type: complex128 Value: (2+3i)
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)
}
result
3 4 5
- T(v)는 v라는 값을 T type으로 변환시켜 준다.
- 형변환 예시
var i int = 42
var f float64 = float64(i)
var u uint = uint(f)
or
i := 42
f := float64(i)
u := uint(f)
- C와 달리 Go는 다른 type의 요소들 간 할당에는 명시적인 변환을 필요로 한다.
Interface type
package main
import "fmt"
func main() {
v := 42 // change me!
j := v
fmt.Printf("v is of type %T\n", j)
}
result
v is of type int
- := 혹은 var = 표현을 통해 명시적인 type을 정의하지 않고 변수를 선언할 때, 해당 변수의 type은 오른 편에 있는 값으로 부터 유추 된다.
i := 42 // int
f := 3.142 // float64
g := 0.867 + 0.5i // complex128
- 변수 선언의 오른 쪽에 무언가 적힐 때, 새로운 변수는 동일한 type이 된다.
v := 42 // change me!
j := v // j = int type
상수
package main
import "fmt"
func main() {
const World = "世界"
fmt.Println("Hello", World)
const Pi = 3.14
fmt.Println("Happy", Pi, "Day")
const Truth = true
fmt.Println("Go rules?", Truth)
}
result
Hello 世界
Happy 3.14 Day
Go rules? true
- 상수는 변수처럼 선언되지만 const 키워드와 함께 선언된다.
- 상수는 character, string, boolean, 숫자 값이 될 수 있다.
- 상수는 선언된 이후 값이 변경될 수 없다. 만약 값 변경을 시도하면 아래 오류가 발생한다.
prog.go:7:13: cannot assign to const Pi
'프로그래밍' 카테고리의 다른 글
[Gotour] 기초 - 더 많은 타입들: struct와 slice, map (0) | 2023.05.25 |
---|---|
[Gotour] 기초 - 흐름 제어 구문: for, if, else, switch 그리고 defer (0) | 2023.05.23 |