Concept
Basic Types
다른언어와 비슷하다.
- string type
- string
- boolean type
- bool
- numeric types
- int8, uint8, int16 .... int64, uint64, int, uint, uintptr
- float32, float64
- complext64, complex128
functions
파라미터로 int형 숫자 2개를 보내고 곱한 값을 Return하는 함수를 만들어보자.
func multiply(a int, b int) int {
return a * b
}
Go에서의 함수는 왼쪽이 파라미터 명, 오른쪽이 타입이다. 또한, return이 있다면 () 오른쪽에 return type을 지정해주어야 한다. 아래처럼 파라미터의 타입이 모두 동일한 경우 맨 오른쪽에만 타입을 지정해줘도 된다.
func multiply(a, b int) int {
return a * b
}
또한, 여러 타입들을 한 번에 return 해올 수 있다. (Java에는 없었던 기능)
func getNameAndPhoneNumber() (string, int) {
return "qazyj", 123456789
}
위와 같이 타입이 다른 변수 두개를 return할 수 있다.
func main() {
name, number := getNameAndPhoneNumber()
fmt.Print(name, number)
}
받는 방법은 위와같은 방법으로 받을 수 있다. 또한, return한 값을 사용하고 싶지 않을 때는 _를 사용하면 된다. (에러를 Return하는 경우 사용되지 않는 경우가 있기도 함.)
func main() {
name, _ := getNameAndPhoneNumber()
fmt.Print(name)
}
_를 하는 이유는 _를 하지않고 name만 return 받으려고 위와 같이 작성하면 에러가 발생한다. _는 무시되는 value로 컴파일 시에 무시된다.
functions에서 argument를 무제한으로 받을 수 있는 방법도 있다. type앞에 ...을 붙이면 된다.
func main() {
repeatMe("q", "a", "z", "y", "j")
}
func repeatMe(words ...string) {
fmt.Println(words)
}
Naked Return
return 오른쪽에 return되는 값을 넣어주는 것이 아닌 Return Type을 적어주는 곳에 return 값을 넣음.
사용 방법
func main() {
fmt.Print(lenAndUpper("qazyj"))
}
func lenAndUpper(name string) (length int, uppercase string) {
length = len(name) // return 값에 선언해준 변수명이랑 같아야함
uppercase = strings.ToUpper(name) // return 값에 선언해준 변수명이랑 같아야함
return // 필수
}
defer
function이 끝날 때, 추가적으로 무엇인가 동작할 수 있도록 하는 기능
Java에서 못봤던 기능인 것 같은데, 유용하게 쓰일 수 있는 기능 같다.
ex) 이미지를 열거나 파일을 생성하고나서 defer로 이미지, 파일을 닫던가 삭제하는, API로 요청을 보낸다던가 등
테스트
func lenAndUpper(name string) (length int, uppercase string) {
defer fmt.Println("I am done.") // ..1
fmt.Println("lengAndUpper Start") // ..2
length = len(name)
uppercase = strings.ToUpper(name)
fmt.Println("lengAndUpper Finish") // ..3
return
}
defer라는 기능을 통해 1 -> 2 -> 3 번 순서로 출력이 되어야 할 출력물이, 2 -> 3 -> 1 번 순서로 출력되는 것을 볼 수 있다.
'Go' 카테고리의 다른 글
If/switch (0) | 2023.12.28 |
---|---|
for, range, args (0) | 2023.12.28 |
Variables/Constants (0) | 2023.12.27 |
Import/Export (0) | 2023.12.24 |
package와 main (0) | 2023.12.24 |