함수
GOLANG 에서 함수를 쓰는것 또한 다른 언어랑 비슷하다.
package main func nopara() { println("nopar") } func para(text string) { print(text) } func main() { println("function") nopara() para("test") }
이 코드를 실행하면 다음과 같이 출력된다.
└─$ go run func.go function nopar test
가변인자함수
함수를 호출할 때 전달하는 값의 개수를 매번 다르게 전달할 수 있도록 한다. 하지만 전달할 때 모두 동일한 타입으로 전달해야 한다.
package main func text(msg ...string) { for _, s := range msg { println(s) } } func main() { text("1", "2", "3", "4", "5") println("end") }
예제에서 보이듯 가변인자함수를 선언할 때 func [함수이름] ([변수이름] …[변수형]) [반환형] 형태로 선언한다. 즉 [ … ] 기호를 통해 선언한다.
실행하면 다음과 같은 결과가 나온다.
└─$ go run func2.go 1 2 3 4 5 end
익명함수
함수를 선언할 때 메모리 할당 및 초기화를 통해 지속적으로 메모리 리소스를 사용하고 함수를 호출할 때 메모리 주소를 검색하고 가져와서 사용한다.
즉 함수 개수가 많아질수록 프로그램이 사용하는 메모리는 늘어나고 그만큼 프로그램이 무거워 진다.
이를 해결하고자 함수의 ‘기능적인 요소’ 만 가져와 사용할 수 있도록 ‘익명함수’가 생겨났다.
package main func main() { sum := func(n ...int) int { // 익명함수를 선언하며 인자값은 int, 리턴값은 int 로 선언 s := 0 for _, i := range n { s += i println("run in func ", s) } return s } result := sum(1,2,3,4,5) // 익명함수 호출 println (result) }
결과값
└─$ go run func3.go run in func 1 run in func 3 run in func 6 run in func 10 run in func 15 15
일급함수
GOLANG 에서는 함수 자체를 다른 함수의 매개변수로 전달하거나 다른 함수의 반환값으로 사용될 수 있다.
즉 함수의 입력 또는 리턴 파라미터로서 함수가 사용될 수 있다.
package main func main() { add := func(i int, j int) int { //변수 add 에 익명함수 할당 return i + j } r1 := calc(add, 10, 20) // add 함수 전달 println(r1) r2 := calc(func(x int, y int) int { return x - y }, 10, 20) // 직접 첫번째 파라미터에 익명함수를 정의함 println(r2) } func calc(f func(int, int) int, a int, b int) int { result := f(a, b) return result }
┌──(daleji㉿DESKTOP)-[~] └─$ go run firstclass_function.go 30 -10
type 형
- 이해몬함
리턴
함수를 정의할 때 값을 리턴해야 할 경우 해당 변수에 대한 타입을 선언해야 한다.
func sum(nums ...int) int64 { // 리턴값이 1개일 때 맨 뒤 'int64' 로 선언한다. ~ return num ~ func sum(nums ...int) (count int, total int) { // 리턴값이 여러개일 때 리턴 파라미터 명과 그 타입을 선언한다. ~ return ~ func sum(nums ...int) (int, int) { // 리턴값이 여러개일 때 이렇게 표현할 수도 있다. ~ return count, total ~