함수 인수 개수가 고정적이지 않은 함수를 가변 인수 함수 라고 한다. ... 키워를 사용해서 가변 인수 처리가 가능한데, 인수 타입 앞에 ... 를 붙이면 해당 타입의 인수를 여러 개 받는 가변인수로 처리된다. 또 ...inferface{} 를 적으면 모든 타입의 가변인수를 받을 수 가 있다.
fucn Print(args ...inferface{}) string{
for _, arg := range args {
swtich f := arg.(type) {
case bool:
val := arg.(bool)
case float64:
val := arg.(float64)
case int:
val := arg.(int)
}
}
}
때론 함수가 종료되기 딕전에 실행해야 하는 코드가 있을 수 있다. 대표적으로 파일이나 소켓핸들처럼 OS 내부 자원을 사용하는 경우다. 파일을 생성하거나 읽을 때 OS에 파일 핸들을 요청한다. 그러면 OS는 파일 핸들을 만들어서 프로그램에 알려주는데 내부 OS자원을 사용할 경우 반드시 OS에게 자원을 돌려줘야만 한다.
작업 이후 반환해야 하기 때문에 잊지 않고 함수 종료 전에 처리해야 하는 코드가 있을때 defer를 사용해 실행해준다.
defer 실행문
명령문은 바로 실행되지 않고 함수 종료되기 전 실행되도록 지연이 된다. 명령문은 한 줄의 코드로 일반적으로 함수 호출을 사용한다. defer의 경우 역순으로 실행되기 때문에 맨 아래에 적힌 defer부터 위에 적힌 defer까지 순차적으로 실행된다.
함수 타입 변수란 함수를 값으로 갖는 변수를 의미한다. 함수를 숫자처럼 표현하게 된다. 시작 지점이 바로 함수를 가리키는 값이고 마치 포인처럼 함수를 가리키는데 이것을 함수 포인터라고 부른다.
함수 타입은 함수 타입은 함수명과 암수 코드 블록을 제외한 함수 정의로 표시한다.
func (int, int) int
또한 가독성을 위해 함수 정의를 별칭으로 할 수 있다.
type opFunc func (int, int) int
func add(a, b int) int {
return a+b
}
func mul
func getOperator(op string) opFunc {
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(1, 2)
}