값에 의한 호출은 함수를 호출할 때 매개변수 값을 복사해서 함수 내부로 전달한다. 함수 내부에서는 전달된 매개변수의 본래 값을 변경할 수 없다. Go는 값에 의한 호출이 기본이며, 함수 내부에서 본래 값을 변경하려면 & 연산자로 변수의 메모리 주소를 전달해야 한다.


다음은 값에 의한 호출 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
package main
 
import "fmt"
 
func inc(i int) {
    i = i + 1
}
 
func main() {
    i := 10
    inc(i)
    fmt.Println(i)
}
cs

위의 코드를 실행하면 10이 나온다. 


참조에 의한 호출로 매개변수를 전달하면 함수에서는 전달한 매개변수의 메모리 주소를 매개변수로 받는다. 이때 * 연산자를 사용하여 매개변수 타입을 포인터로 지정해야 한다. 함수의 매개변수 타입을 포인터로 지정하면 변수의 값이 아닌 변수의 메모리 주소가 전달된다. 이렇게 포인터로 메모리 주소에 접근하면 매개변수로 전달된 인수의 본래 값을 변경할 수 있다. 단, 참조 타입인 슬라이스와 맵은 메모리의 참조 값을 전달하는게 기본이다.


다음은 참조에 의한 호출 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
package main
 
import "fmt"
 
func inc(i *int) {
    *= *+ 1
}
 
func main() {
    i := 10
    inc(&i)
    fmt.Println(i)
}
cs


위의 코드를 실행하면 11이 나온다.

반응형

+ Recent posts