Go Function

Function

String과 boolean은 다음과 같이 선언한다.

string, bool

Go에는 굉장히 다양한 숫자 타입들이 존재한다.

일반적인 자바에서 지원하지 않는 unsigned부터 int8,int16,int32,int64등 아주 다양하다.

그러면 곱셈함수를 만들어보자.

package main

import "fmt"

func multiply(a int, b int) int{
	return a * b
}

func main() {
	fmt.Println(multiply(2,2))
}

함수의 매개변수에는 반드시 타입을 지정해주어야한다. (java,kotlin)

그리고 함수의 반환 타입을 지정해주어야한다. 어디에? 인자 뒤에 (kotlin)

함수의 선언의 경우 상당히 kotlin과 유사한점이 많다.

이것이 인싸 언어를 배운 덕분인가..

package main

import "fmt"

func multiply(a, b int) int{
	return a * b
}

func main() {
	fmt.Println(multiply(2,2))
}

매개변수의 경우 같은 타입이라면 위와 같이 줄여쓰는 것이 가능하다.

Go 함수의 한가지 더 재밌는 점은 여러 값을 리턴하는 것이 가능하다는 것이다.

이는 다른 언어들에서 지원하지 않는 Go만의 아주 이상한 기능이다.

그러면 직접 한번 만들어보자.

package main

import (
	"strings"
)

func lenAndUpper(name string) (int, string){
	return len(name), strings.ToUpper(name)
}

func main() {
	totalLength, upperName := lenAndUpper("harry")

}

여기까지만 보면 별 문제 없는 것 처럼 보이지만, 위 코드는 에러를 발생시킨다.

Go의 해괴한 기능 중 하나인데, 무엇인가 변수에 값을 할당하고 사용하지 않으면 에러를 뱉는다.

그래서 아래와 같이 만들면 제대로 실행한다.

package main

import (
	"fmt"
	"strings"
)

func lenAndUpper(name string) (int, string){
	return len(name), strings.ToUpper(name)
}

func main() {
	totalLength, upperName := lenAndUpper("harry")
	fmt.Println(totalLength, upperName)
}

strings 패키지는 Go에서 지원하는 표준 패키지의 한 종류이다.

Go의 표준 패키지는 아주아주아주아주 큰데, 거의 모든 기능들을 다 포함하고 있다.

이미지, DB 등등 일반적인 언어에서 지원하지 않는 기능들까지 모두 패키지로 지원하고 있다.

만약 어떤 함수가 두 개의 값을 반환하는데 반환 값을 하나만 받고 싶은 경우는 어떻게 할 수 있을까?

기본적으로는 2개의 리턴값을 모두 받아야하지만 예외적으로 특정 반환 값을 무시할 수 있다.

package main

import (
	"fmt"
	"strings"
)

func lenAndUpper(name string) (int, string){
	return len(name), strings.ToUpper(name)
}

func main() {
	totalLength, _ := lenAndUpper("harry")
	fmt.Println(totalLength)
}

함수의 매개변수를 무한히 받는 것 또한 가능하다.

아래와 같이 선언해보자.

package main

import "fmt"

func repeateMe(words ...string)  {
	fmt.Println(words)
}

func main() {
	repeateMe("harry","minkuk","donghoon")

}

naked return

package main

import (
	"fmt"
	"strings"
)

func lenAndUpper(name string) (length int, uppercase string){
	length = len(name)
	uppercase = strings.ToUpper(name)
	return
}

func main() {
	totalLength, uppercase := lenAndUpper("harry")
	fmt.Println(totalLength,uppercase)
}

go는 반환 값을 변수로 선언하고 해당 변수의 값을 명시적으로 넣어주면 return에 반환할 값을 명시적으로 선언하지 않아도 된다.

이러한 기능을 naked return이라고 부른다. 보다시피 return에 값이 없다.

defer

defer는 Go의 아주 멋진 기능이다.

function이 끝나고 다른 것을 실행할 때 사용한다.

package main

import (
	"fmt"
	"strings"
)

func lenAndUpper(name string) (length int, uppercase string){
	defer fmt.Println("I'm done")
	length = len(name)
	uppercase = strings.ToUpper(name)
	return
}

func main() {
	totalLength, uppercase := lenAndUpper("harry")
	fmt.Println(totalLength,uppercase)
}

defer 키워드로 선언한 기능은 function이 끝나고 실행한다.

이 키워드의 멋진 점은 함수가 끝났을 때 기능을 수행할 수 있기 때문에 여러가지 후처리 기능이 가능하다는 점이다.

Reference

Nomad Coder - 니꼴라스 선생님



© 2022. by minkuk

Powered by minkuk