Go 함수 인수는 값으로 전달됩니다.
먼저, 예제에서 관련없는 부분을 버려서 단순히 인수를 값으로 전달하고 있음을 쉽게 알 수 있습니다. 예를 들면
package main
import "fmt"
func byval(q *int) {
fmt.Printf("3. byval -- q %T: &q=%p q=&i=%p *q=i=%v\n", q, &q, q, *q)
*q = 4143
fmt.Printf("4. byval -- q %T: &q=%p q=&i=%p *q=i=%v\n", q, &q, q, *q)
q = nil
}
func main() {
i := int(42)
fmt.Printf("1. main -- i %T: &i=%p i=%v\n", i, &i, i)
p := &i
fmt.Printf("2. main -- p %T: &p=%p p=&i=%p *p=i=%v\n", p, &p, p, *p)
byval(p)
fmt.Printf("5. main -- p %T: &p=%p p=&i=%p *p=i=%v\n", p, &p, p, *p)
fmt.Printf("6. main -- i %T: &i=%p i=%v\n", i, &i, i)
}
산출:
1. main -- i int: &i=0xf840000040 i=42
2. main -- p *int: &p=0xf8400000f0 p=&i=0xf840000040 *p=i=42
3. byval -- q *int: &q=0xf8400000d8 q=&i=0xf840000040 *q=i=42
4. byval -- q *int: &q=0xf8400000d8 q=&i=0xf840000040 *q=i=4143
5. main -- p *int: &p=0xf8400000f0 p=&i=0xf840000040 *p=i=4143
6. main -- i int: &i=0xf840000040 i=4143
함수에서 main
, i
인 int
메모리 위치 변수 ( &i
) 0xf800000040
의 초기 값은 ( i
) 42
.
함수에서 main
, p
포인터이다 int
메모리 위치 (AT 변수 &p
) 0xf8000000f0
의 값 (이 함께 p
= &i
) 0xf800000040
내지 An되는 점 int
값 ( *p
= i
) 42
.
함수에서 main
, byval(p)
값 (할당하는 함수 호출 p
= &i
) 0xf800000040
메모리 위치 (에서의 인수 &p
) 0xf8000000f0
함수에 byval
파라미터 q
메모리 위치 ( &q
) 0xf8000000d8
. 즉, byval
매개 변수에 메모리가 할당 q
되고 main
byval
인수 값 p
이 할당됩니다. p
및 의 값 q
은 처음에는 동일하지만 변수 p
와 q
는 다릅니다.
함수 byval
포인터 사용 q
( *int
포인터의 사본 임), p
( *int
), 정수 *q
( i
) INT 새로운 값으로 설정된다 4143
. 돌아 오기 전에 마지막에. 포인터 q
가 nil
(0 값)으로 설정되어 복사본 p
이므로 영향을주지 않습니다 q
.
함수에서 main
, p
포인터이다 int
메모리 위치 (AT 변수 &p
) 0xf8000000f0
의 값 (이 함께 p
= &i
) 0xf800000040
새로운 어떤 점 int
값 ( *p
= i
) 4143
.
함수에서 main
, i
인 int
메모리 위치 변수 ( &i
) 0xf800000040
의 최종 값은 ( i
) 4143
.
귀하의 예 에서 함수 호출에 대한 인수로 사용되는 함수 main
변수 는 함수 매개 변수 와 동일하지 않습니다 . 이름은 같지만 범위와 메모리 위치가 다른 변수입니다. 함수 매개 변수 는 함수 호출 인수를 숨 깁니다 . 이것이 제 예에서 인수와 매개 변수 변수의 이름을 지정 하고s
gotest
gotest
s
s
s
p
q
각각의 차이를 강조 할 수 있습니다.
사용자의 예에서, ( &s
) 0x4930d4
변수에 대한 메모리 위치의 주소 s
함수의 main
함수 호출의 인수로서 사용 gotest(s, done)
하고, 0x4974d8
기능을위한 메모리 위치의 주소 gotest
파라미터 s
. s = nil
함수의 끝에서 매개 변수를 설정하면 gotest
변수 s
에 영향을주지 않습니다 main
. s
in main
과 s
in gotest
은 별개의 메모리 위치입니다. 유형 측면에서 &s
is **Something
, s
is *Something
, *s
is Something
입니다. &s
(메모리 위치 주소) s
에 대한 포인터이며, 유형의 익명 변수 (메모리 위치 주소)에 대한 포인터입니다.Something
. 값의 측면에서, main.&s != gotest.&s
, main.s == gotest.s
, main.*s == gotest.*s
,와 main.s.number == gotest.s.number
.
mkb의 현명한 조언을 받아들이고 println(&s)
. fmt
예를 들어 패키지를 사용하십시오.
fmt.Printf("%v %p %v\n", &s, s, *s)
포인터는 동일한 메모리 위치를 가리킬 때 동일한 값을 갖습니다. 포인터는 다른 메모리 위치를 가리킬 때 다른 값을 갖습니다.