1. 가변 인자 타입


... 키워드를 이용해서 가변 인수를 처리할 수 있음

func sum(nums ...int) int {
	// nums의 타입은 []int 이다.
}

2. Defer


함수가 종료되기 직전에 실행해야되는 코드를 호출할 때 사용. 대표적으로 파일이나 소켓 핸들처럼 OS 내부 자원을 사용할 때 많이 활용합니다.

// defer 명령문 으로 사용합니다.

func main() {


func main() {
	f, err := os.Create("test.txt")
	if err != nil {
		fmt.Println("Fail to create a file")
		return
	}

	defer fmt.Println("반드시 호출됩니다.")
	defer f.Close()
	defer fmt.Println("파일을 닫았습니다.")

	fmt.Println("파일에 Hello World를 씁니다.")
	fmt.Fprintln(f, "Hello World")
}

defer 명령문이 함수가 종료되면 순차적으로 실행됩니다.

3. 함수 타입 변수


함수 타입 변수란 함수를 값으로 가지는 변수를 의미함. 함수의 시작 지점(Address)을 가르키는 변수라고 보면 되며, 일종의 포인터(함수 포인터)라고 볼 수 있다.

func add(a, b int) int {
	return a + b
}

// 위 함수를 가르킬 수 있는 함수 포인터의 변수 타입은
func (int, int) int

func add(a, b int) int {
	return a + b
}

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

func getOperator(op string) func(int, int) int {
	if op == "+" {
		return add
	} else if op == "*" {
		return mul
	} else {
		return nil
	}
}

func main() {
	var operator func(int, int) int
	operator = getOperator("*")

	var result = operator(3, 4)
	fmt.Println(result)
}

// 별칭을 사용할 수도 있다.
// type opFunc func (int, int) int
// -> func getOperator(op string) opFunc

4. 함수 리터럴


함수 리터럴은 다른 언어에서 익명 함수(또는 람다)라고 말하는 것 함수의 이름없이 함수를 정의하여 사용. 변수에 넣지 않거나 바로 호출하지 않으면, 호출할 수 없다.

func getOperator(op string) opFunc {
	if op == "+" {
		return func(a, b int) int {
			return a + b
		}
	} else if op == "*" {
		return func(a, b int) int {
			return a * b
		}
	} else {
		return nil
	}
}

func main() {
	fn := getOperator("*")

	result := fn(3, 4)
	fmt.Println(result)
}