> 백엔드 개발 > Golang > go 값 전달 및 주소 전달의 예

go 값 전달 및 주소 전달의 예

藏色散人
풀어 주다: 2020-10-30 15:00:20
앞으로
2327명이 탐색했습니다.

칼럼에서 소개됩니다.

먼저 간단한 예를 살펴보겠습니다

go 값 전달 및 주소 전달의 예

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}
로그인 후 복사

  • 5로 전달됩니다. of slicing (변수 배열) Slicing은 참조로 전달됩니다
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}
로그인 후 복사

(b) 함수가 호출되면 슬라이스, 딕셔너리(맵), 인터페이스, 채널 등의 참조 유형이 기본적으로 참조로 전달됩니다(명시적으로 전달되지 않더라도). 바늘).

위 내용은 go 값 전달 및 주소 전달의 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:learnku.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿