오늘은 Go의 인자값 전달과 어떤 형식으로 인자의 값들을 받고 형식을 지정하는지 그리고 중요한 키워드 defer에 대해 알아보겠습니다
인자값 전달 & 받기
코드부터 먼저 보겠습니다
package main
import "fmt"
func multply(a int, b int) int {
return a + b
}
func multply2(a , b int) int {
return a + b
}
func main() {
fmt.Println(multply(1, 9))
}
위 처럼 두가지 형식이 가능합니다 원래 알고 있던 언어들에 type 지정과 다르게 변수 뒤에 type을 지정해줍니다
보이듯이 func앞에 type을 지정하는 게 아닌 func에도 뒤에 type을 지정해줍니다 multply2처럼 묶을수도 있구요
그 다음 보여줄 예시는 좀 특이합니다 코드를 봅시다
package main
import (
"fmt"
"strings"
)
func lenAndUpper(name string) (int, string) {
return len(name), strings.ToUpper(name)
}
func main() {
//1번
totalLenght, upperName := lenAndUpper("sleeg")
fmt.Println(totalLenght, upperName)
//결과 값 5, SLEEg
//2번
totalLenght, _ := lenAndUpper("sleeg")
fmt.Println(totalLenght)
//결과 값 5
}
신기하죠 원래 C에서 동작하는 방식이였다면 func 두개를 만들어야 했을텐데 func를 하나만 작성해도 두 가지의 반환값을 받을 수 있다니.. 코드가 정말 짧아졌습니다
여기서 그러면 궁금한 점이 생기죠 하나의 반환값만 받고 싶다면 물론 lenAndUpper func를 수정해도 되지만 2번처럼 아예 무시해버려도 잘 작동하게 됩니다
그 다음 자주 사용하는 배열을 전달하고 받는 방식입니다
package main
import "fmt"
func repeatMe(words ...string) {
fmt.Println(words)
}
func main() {
repeatMe("sleeg", "one", "two", "1", "2")
}
Main에서 5개의 문자들을 전달했고 repeatMe func에서는 words라는 배열을 만듭니다 ...을 넣음으로써 말이죠
...을 type앞에 놔두면 배열을 만들어줍니다!
다음 코드는 Go의 중요한 키워드 defer입니다
package main
import (
"fmt"
"strings"
)
func lenAndUpper(name string) (lenght int, uppercase string) {
defer fmt.Println("func 사용 끝!")
lenght = len(name)
uppercase = strings.ToUpper(name)
return
}
func main() {
totalLenght, up := lenAndUpper("sleeg")
fmt.Println(totalLenght, up)
}
//결과 값
func사용 끝!
5 SLEEG
자 아까 본 2가지의 반환 값이랑 비슷하죠 추가된건 defer이랑 return 값이 없다는 것 입니다
먼저 인자를 넘기는 방식은 같은데 받는 방식에서 위 방식을 써서 lenght, uppercase를 반환할 거야라고 인자값을 받을 때 정해버립니다
그냥 return만 쓰면 되죠!
그리고 defer은 func가 끝나면 이런 행동을 할 거야~ 라는 키워드 입니다 신기하죠.. 뭔가 디버깅하는 기분이네요
글을 짧게 쓰는 게 나중에 찾아보기도 쉽고 글 제목에 맞게 원하는 것만 딱 얻어갈 수 있을 거 같아 이번에는 조금 짧게 써보려고 합니다
궁금한 점이나 틀린 부분이 있다면 댓글 부탁드립니다!
'Go' 카테고리의 다른 글
[Go] Go루틴이란 무엇인가? (0) | 2023.02.16 |
---|---|
[Go] struct를 생성하고 error코드 작성하기 (0) | 2023.01.09 |
[Go] append와 가비지 컬렉터의 관계 & if, switch문 알아보기 (0) | 2023.01.09 |
[Go] $GOPATH/go.mod exists but should not 오류 (0) | 2023.01.09 |
[Go] Main Package와 접근 제한자 & 변수 (2) | 2023.01.08 |