1. 변수 앞에 &를 추가하여 이 변수의 주소(즉, 이 변수의 포인터)를 나타냅니다. 이 포인터에 해당하는 값을 나타내는 포인터 변수(자체 이해)
//main.gopackage main func ByAss() { s := 100 p := &s // s 的地址给了p fmt.Println(*p) //100 所以p对应的值变成了100 *p += 100 fmt.Println(*p) //200 fmt.Println(s) //200 p和s相同的地址,所以s也变成200}//demo.gopackage main func main() { ByAss()}
Go는 값별 전달을 사용하여 기본적으로 매개변수를 전달합니다. 즉, 매개변수의 복사본을 전달합니다. 함수가 매개변수의 복사본을 받은 후 변수를 사용하는 동안 복사본의 값이 변경될 수 있지만 Function(arg1)과 같은 원래 변수에는 영향을 미치지 않습니다.
2. 일반 값 전달(이 예를 주의하세요. 매우 단순해 보이지만 무시하기 쉽습니다.)
func ByValue1(n1 int) { //此时n1 是n 的一个拷贝,所以地址不一样 fmt.Println(&n1)//0xc00000a098}package main func main() { n := 100 fmt.Println(&n) //0xc00000a090 ByValue1(n)//传递副本}
복사 작업 대신 매개변수 값을 직접 수정하는 함수를 원하는 경우 이때, Function(&arg1)과 같이 참조로 전달되는 함수에는 주소(&variable과 같이 변수 이름 앞에 앰퍼샌드가 추가됨)가 전달됩니다. , 포인터가 함수에 전달됩니다.
3.
func main() { n := 100 fmt.Println(&n) //0xc00000a090 ByReference(&n) //传递指针 fmt.Println(n) //200}//注意函数 参数类型需要是用指针符号(*)func ByReference(n1 *int) { *n1 += 100 fmt.Println(n1)//0xc00000a090 地址与n相同, 所以n值被改变了 //注意 //ip := &n1//这个写法有问题,表示地址的地址 //fmt.Println(ip)}
주소로 전달하려는 경우
(a) 배열도 arr := [5]int{1,3,5,6,7}arrByValue(&arr) //也需要使用& 符号fmt.Println(arr) //[100 300 5 6 7]func arrByValue(arr1 *[5]int) {
arr2 := arr1
arr2[0] = 100
arr2[1] = 300}
func main() { arr := []int{1,3,5,6,7} bbb(arr) //没有使用& 符号 fmt.Print(arr[0])// 11 结果已经改变,说明数组是地址传递 //就算不通过函数,也是引用传递 //arr := []int{1,3,5,6,7} //arr2 := arr //arr2[1] = 0 //fmt.Print(arr)//[1 0 5 6 7]}//aaafunc bbb(arr1 []int) { arr1[0] += 10}
위 내용은 go 값 전달 및 주소 전달의 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!