A Tour of Go
A Tour of Go
https://go.dev/tour/welcome/1
Language-kor : https://go-tour-ko.appspot.com/welcome/1
go get golang.org/x/tour
패키지
모든 Go 프로그램은 패키지로 구성되며, 프로그램은 main 패키지에서부터 실행됩니다.
이 프로그램은 "fmt" 와 "math/rand" 경로의 패키지를 import하여 사용합니다.
패키지의 이름은 import 경로의 마지막 요소와 같습니다. 예를 들어 "math/rand" 패키지는 package rand 문으로 시작하는 파일들로 구성되어있습니다.
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println("My favorite number is", rand.Intn(10))
}
- 일반적인 import문
import "fmt"
import "math"
- "factored" import문 : (괄호)로 그룹지어 사용하는 발전된 형식
import (
"fmt"
"math"
)
변수
- 패키지에서는 대문자로 시작하는 이름의 변수만 export됩니다. ex)math.Pi
- export되지 않은 변수들은 패키지의 밖에서 접근할 수 없습니다.
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println(math.Pi)
}
- var 문은 변수에 대한 목록을 선언합니다. Go 문법에서 변수의 자료형은 변수명 뒤에 적어줍니다.
- var 문은 package나 함수 단에서 선언할 수 있습니다.
package main
import "fmt"
var c, python, java bool
func main() {
var i int
fmt.Println(i, c, python, java)
}
실행결과 : 0 false false false
💡Zero values
명시적인 초깃값 없이 선언된 변수는 zero value 가 주어집니다.
- 숫자 type : 0
- boolean type : false
- string : "" (빈 문자열)
- 변수 선언은 한 변수 당 하나의 초깃값을 포함할 수 있습니다.
- 만약 초깃값이 존재한다면, 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)
}
실행결과 : 1 2 true false no!
- 함수 내에서는 := 라는 짧은 변수 선언은 암시적 type으로 var 선언처럼 사용될 수 있습니다.
- 함수 밖에서는 모든 선언이 키워드(var, func, 기타 등등)로 시작하므로 := 구문은 사용할 수 없습니다.
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)
}
실행결과 : 1 2 3 true false no!
상수
- 상수는 변수처럼 선언되지만 const 키워드와 함께 선언됩니다.
- 상수는 character 혹은 string, boolean, 숫자 값이 될 수 있습니다.
- 상수는 := 를 통해 선언될 수 없습니다.
함수
순서대로 읽히는 Go구문
- C는 나선형으로 읽히는 반면, Go는 문장이 왼쪽에서 오른쪽으로 읽히도록 작성되었습니다.
- Go의 문법에서는 선언 시 함수/매개변수와 반환값을 헷갈리는 것을 방지하기 위해 func 함수이름(매개변수) 뒤에 반환값을 적어줍니다. e.g.) func add(x int, y int) int { /* ... */}
- 또한 매개변수의 자료형 역시 매개변수 이름 뒤에 type 이 온다는 것을 명심하세요. e.g.) func add(x int, y int) int { /* ... */}
- 이러한 방법은 문장이 왼쪽에서 오른쪽으로 명확히 읽히게끔 합니다.
package main
import "fmt"
func add(x int, y int) int {
return x + y
}
func main() {
fmt.Println(add(42, 13))
}
- 배열을 선언할 때에도 [괄호] 를 자료형 앞에 적습니다. 표현식에서는 변수명 뒤에 [괄호] 를 놓습니다.
var a []int
x = a[1]
- 포인터를 선언할 때도 동일합니다. 하지만 표현식에서는 p*의 * 기호가 곱셈 연산자와 혼동될 수 있기 때문에,
*p로 작성합니다.
var p *int
x = *p
[]int("hi")
위와 같은 내용을 포인터 모양으로 변환해서 본다면 아래와 같이 작성할 수 있습니다.
(*int)(nil)
포인터를 맨 앞에 표기하려면 괄호를 사용해 묶어주어야 합니다.
C의 기존 포인터 기호*를 사용하기 위해 불가피하게 괄호를 사용하지만, 그 대신 Go의 구문은 특히 복잡한 문장에서 C보다 더 이해하기 쉽게 구성되었습니다.
연속되는 동일한 매개변수타입 생략하기
- Go 언어에서는 함수 매개변수의 자료형이 같을 경우, 한 번만 적어주면 됩니다.
func add(x, y int) int {
return x + y
}
- 예를 들어, func (x, y int) int와 같이 작성하면 x와 y 모두 int 타입임을 의미합니다. C 언어처럼 각각의 매개변수에 대해 자료형을 반복해서 명시할 필요가 없습니다.
- 이런 방식은 코드의 간결함을 높여주고, 특히 func add(a,b,c,d,e,f,g int) 처럼 여러 매개변수의 자료형이 같을 때 유용합니다.
- 만약 매개변수의 자료형이 다를 경우, 각 매개변수에 대해 자료형을 별도로 명시해야 합니다.
함수명, 매개변수명 생략하기
- Go언어에서는 함수 또는 매개변수의 이름을 생략할 수 있습니다. 다음 두 블럭은 완전히 동일한 결과를 출력합니다.
sum := func(a, b int) int { return a+b } (3, 4)
func add(a,b int) int
{
return a+b
}
sum := func add(3,4)
함수의 반환값
Go에서는 함수 하나가 여러개의 결과값을 반환할 수 있습니다.
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)
}
swap 함수는 string y와, string x를 반환합니다.
네임드 반환값
package main
import "fmt"
func split(sum int) (int,int) {
int x = sum * 4 / 9
int y = sum - x
return x, y
}
func main() {
fmt.Println(split(17))
}
위 문장은 네임드 반환값을 사용하여 아래와 같이 작성할 수 있습니다. 내용은 완전히 동일합니다.
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))
}
Go에서는 이름이 정해진 네임드 반환값을 사용할 수 있습니다. 그 경우, 함수의 맨 위에서 정의된 변수처럼 다뤄집니다. 인자가 없는 return 문은 이름이 주어진 반환 값을 반환합니다. 이것을 "naked" return 이라고 합니다.
naked return문은 이 예제에서처럼 짧은 함수에서만 사용되어야합니다. 긴 함수에서는 그것이 가독성을 떨어뜨릴 수 있습니다.
'STUDY > GoLang' 카테고리의 다른 글
| Go, Visual Studio Code 설치하기 (0) | 2024.09.23 |
|---|