Post

Golang 함수

Golang의 문법중 부족했던 부분들만 따로 요약하여 포스팅하려한다.
이번 포스팅의 주제는 함수다.

👉함수

가변 인수 함수는 … 키워드를 사용하여 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func add(nums ...int) {
    // nums는 슬라이스로 취급된다.

    sum := 0
    for _, val := range nums {
        sum += v
    }
    fmt.Println(sum)
}

func add2(nums []int) {
    sum := 0
    for _, val := range nums {
        sum += v
    }
    fmt.Println(sum)
}
func main() {
    // 두 함수의 호출방식은 살짝 다르다.
    add(1,2,3,4)
    add2([]int{1,2,3,4})
}

모든 타입을 다 받고싶다면 빈 인터페이스를 이용한다.

1
2
3
4
5
6
7
8
9
10
11
12
func Print(args ...interface{}) {
    for _, arg := range args{
        switch f:=arg.(type) {
        case bool:
            val := arg.(bool)
        case float64:
            val := arg.(float64)
        case int:
            val := arg.(int)
        }
    }
}

defer

함수 종료 전에 실행을 보장한다. OS의 자원을 반납해야할 때 사용한다.
파일.Close(), 네트워크 Close() 등.


함수타입 변수

함수 타입도 별칭 타입을 통해 정의할 수 있다.

1
2
type opFn func (int,int) int


함수 리터럴 (람다)

1
2
3
4
5
6
7
8
9
10
var a int = 3
B := a  
// -> B := 3 (리터럴)

func add(a,b int) int {
    return a+b
}
f := add
// -> f:= func (a,b int) int {return a+b}
// 함수도 리터럴로 생성할 수 있다.

의존성 주입

외부에서 로직을 주입하는 것을 의존성 주입이라고 한다.
의존성 주입을 통해 로직의 분리가 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type Writer func(string)
func writeHello(writer Writer) {
    // 무조건 writer함수에 "Hello world"를 쓰겠다. 
    // 네트워크든, 파일이든, 화면이든
    writer("Hello World")
}

func main() {
    f, err := os.Create("test.txt")
    if err != nil {
        fmt.Println("Failed to Create file")
        return
    }
    defer f.Close()

    // 의존성을 파일 입력으로 주입
    writeHello(func(msg string){
        fmt.Fprintln(f, msg)
    })

    // 의존성을 콘솔 출력으로 주입
    writeHello(func(msg string) {
        fmt.Println(f, msg)
    })
}

Reference

Tucker의 Go 언어 프로그래밍

This post is licensed under CC BY 4.0 by the author.