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
반응형