Scroll Top

GOLANG – 함수

GO

함수

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
        ~

Related Posts

Leave a comment

You must be logged in to post a comment.