Archive/Go

Go 의 함수 part 2 (naked return, defer)

nimkoes 2021. 5. 16. 13:16
728x90

 

 

Go 의 함수에는 'naked return' 이라는 것이 있다.

이것의 의미는 return 키워드에 굳이 반환 할 변수를 명시하지 않아도 됨을 뜻한다.

 

part 1 에서 길이와 영문 대문자 변환 결과를 반환하는 함수를 다시 작성해보자.

 

package main

import (
	"fmt"
	"strings"
)

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

func main() {
	totalLength, upper := lenAndUpper("nimkoes")
	fmt.Println(totalLength, upper)
}

 

 

 

part 1 의 'lenAndUpper' 함수와 다른 부분은 반환 타입을 작성할 때 변수 이름을 같이 넣은 부분이다.

그리고 'return' 키워드에서는 반환하는 값에 대한 아무런 정보가 없다.

 

호기심이 생겨서 'naked return' 형식으로 함수를 작성하고, return 할 때 명시적으로 다른 값을 반환 해보았는데

return 키워드에 작성한 값의 우선순위가 높은 것으로 확인 했다.

 

개인적으로 명시적인 코드 작성을 선호해서 'return' 만 써있으면 코드를 읽을 때 혼란스러울 것 같기도 하고,

어쨌든 함수 선언할 때 반환값에 대한 정보가 같이 명시 되어있기 때문에 오히려 보기 편한 것 같기도 하다.

 

 

 

한가지 더 살펴볼 것은 'defer' 라는 것이다.

이것은 함수 실행이 끝난 다음 또 다른 어떤 추가 작업을 하도록 한다.

defer 는 함수가 return 하고난 다음에 실행 된다.

 

package main

import (
	"fmt"
	"strings"
)

func lenAndUpper(name string) (length int, uppercase string) {
	defer fmt.Println("I'm done")

	fmt.Println("start !")
	length = len(name)
	uppercase = strings.ToUpper(name)
	return
}

func main() {
	totalLength, upper := lenAndUpper("nimkoes")
	fmt.Println(totalLength, upper)
}

 

 

main 함수에서 lenAndUpper 실행을 종료한 다음 defer 를 실행 한 것을 확인할 수 있다.

사용하는 방법은 단순하지만 활용하기 나름일거란 생각이 든다.

 

궁금한게 생겨서 defer 를 여러줄에 걸쳐 작성할 수 있나 해봤더니 defer 를 매번 작성해 줘야 하는것 같다.

그리고 굳이 함수의 맨 앞에 써 줄 필요도 없으며, 코드 중간에 작성해도 잘 동작 했다.

하지만 이렇게 섞어서 쓰면 유지보수가 많이 힘들것 같다.

 

마지막으로 여러 defer 를 사용했을 때, 이 구문에 대해 stack 형태로 동작하는 것 같다.

 

package main

import (
	"fmt"
	"strings"
)

func lenAndUpper(name string) (length int, uppercase string) {
	defer fmt.Println("I'm done")
	defer fmt.Println("second message ?")

	fmt.Println("start !")
	length = len(name)
	defer fmt.Println("third ?")
	uppercase = strings.ToUpper(name)
	return
}

func main() {
	totalLength, upper := lenAndUpper("nimkoes")
	fmt.Println(totalLength, upper)
}

 

위 코드에서 보면, lenAndUpper 에서 3개의 defer 를 사용하고 있는데 실행 결과를 보면 defer 가 작성된 역순으로 실행 된다.

 

 

 

 

 

728x90

'Archive > Go' 카테고리의 다른 글

Go 의 if 사용 방법  (0) 2021.05.16
Go 의 for, range, ...args  (0) 2021.05.16
Go 의 함수 part 1 (기본 사용법)  (0) 2021.05.16
Go 의 상수와 변수  (0) 2021.05.16
Go 의 package 와 import  (0) 2021.05.16