Golang

[Golang] 함수

GenieLove! 2022. 3. 21. 23:57
728x90
반응형

1.가변 인수 함수

func sum(nums ...int) int {//slice타입으로 전달된다
	for num := range nums {
    	fmt.Println(num)
    }
}

func main() {
	sum(1, 2, 3, 4)
}

2.defer 지연 실행 - 해당 함수가 종료되기 직전에 실행된다.(제일 최근에 선언된 것부터 실행(코드 역순 실행))

 

3.함수 타입 변수 - 함수를 값으로 갖는 변수

(1)예시 1

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

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

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

func main() {
	var oper func (int, int) int
    oper = getOper("*")//oper에 함수가 할당된다.
    
    var result = oper(3, 4)
    fmt.Println(result)
}

(2)예시 2 - 별칭 이용

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

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

func getOper(op string) opFunc {
	if op == "+" {
    	return add
    } else if op == "-" {
    	return mul
    } else {
    	return nil
    }
}

func main() {
	var oper opFunc
    oper = getOper("*")//oper에 함수가 할당된다.
    
    var result = oper(3, 4)
    fmt.Println(result)
}

4.함수 리터럴 - 이름 없는 함수

(1)예시

type opFunc func (int, int) int

func getOper(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() {
	var oper opFunc
    oper = getOper("*")//oper에 함수가 할당된다.
    
    var result = oper(3, 4)
    fmt.Println(result)
}

(2)내부 상태 - 함수 리터럴을 필요한 변수를 내부 상태로 가질 수 있다(이름 없는 함수 외부에 선언된 변수를 사용할 수 있다). But, 외부함수를 참조식으로 가져오기 때문에 값 변경 시 외부에서도 값 변경된다.

 

(3)의존성 주입

type Writer func(string)

//writer가 무슨 일을 할지 모르기 때문에 이렇게 로직을 주입하는 것을 의존성 주입이라고 한다.
func writeGenie(writer Writer) {//writer 함수 타입 변수 호출
	writer("Hello Genie")
}

func main() {
	f, _ := os.Create("genie.txt")
    defer f.Close()
    
    writeGenie(func(msg string) {
    	fmt.Fprintln(f, msg)
    })
}
728x90
반응형