값에 의한 호출은 함수를 호출할 때 매개변수 값을 복사해서 함수 내부로 전달한다. 함수 내부에서는 전달된 매개변수의 본래 값을 변경할 수 없다. 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) { *i = *i + 1 } func main() { i := 10 inc(&i) fmt.Println(i) } | cs |
위의 코드를 실행하면 11이 나온다.
반응형