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)
}