<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] 了解下函數內部的值傳遞。這里面可以衍生出很多面試題。 ## 引入案例 首先來個常規的函數使用,并思考這里有幾次變量賦值? ```go func foo(a int) { fmt.Printf("a: %v\n", a) } func main() { a := 10 foo(a) } ``` 答案是有兩次賦值的。可以通過查看變量內存地址是否一致的。如果foo函數的變量a與main函數的變量a的地址是不一致的話,那說明有兩次賦值的。請通過以下代碼驗證 ```go func foo(a int) { fmt.Printf("foo.a: %v, pointer: %p\n", a, &a) } func main() { a := 10 fmt.Printf("mian.a pointeris: %p\n", &a) foo(a) } // 運行結果: // mian.a pointeris: 0xc00012a000 // foo.a: 10, pointer: 0xc00012a008 ``` >[info] 總結: > - main函數,變量 a 定義并賦值操作。 > - 調用函數。即有一次賦值操作,**函數體內無需重新定義變量**。 ## 函數變量的修改 示例一 函數的形參是字符串,修改變量的值。是不影響實參的變量的。 ```go func bar(x int) { x = 100 // 變量賦值 fmt.Printf("bar.x: %v\n", x) } func main() { x := 10 bar(x) fmt.Printf("main.x: %v\n", x) } // 運行結果: // bar.x: 100 // main.x: 10 ``` 示例二 函數的形參是切片,修改函數的切片元素。是影響實參的變量。 ```go func testSlice(s []string) { fmt.Printf("test.s: %v, pointer: %p\n", s, s) s[1] = "shanghai" // 修改切片的元素 fmt.Printf("test.s: %v, pointer: %p\n", s, s) s = append(s, "guangdong") // 擴容切片 fmt.Printf("test.s: %v, pointer: %p\n", s, s) } func main() { s := []string{"beijing", "guangdong", "hunan"} fmt.Printf("main.s: %v, pointer: %p\n", s, s) testSlice(s) fmt.Printf("main.s: %v, pointer: %p\n", s, s) } // 運行結果: // main.s: [beijing guangdong hunan], pointer: 0xc0000a0150 // test.s: [beijing guangdong hunan], pointer: 0xc0000a0150 // test.s: [beijing shanghai hunan], pointer: 0xc0000a0150 // test.s: [beijing shanghai hunan guangdong], pointer: 0xc0000b6120 // main.s: [beijing shanghai hunan], pointer: 0xc0000a0150 ``` >[info] 總結: > 函數形參類型決定函數之間修改變量是否有連帶關系。 ## 函數變量修改【變種】 上面的段落可知,函數之間的變量是否相互獨立的。取決于函數形參的數據類型。如果變量是值拷貝,兩個函數變量互不相關。如果變量是引用拷貝,兩個函數變量修改會有所不同。 現在需要實現一個函數形參類型是值拷貝(string, int, boot, float32/float64...)修改變量的值,另一個函數也跟著改變。 ```go func setAge(age *int) { fmt.Printf("setAge.age pointer is: %v, value: %d\n", age, *age) *age++ fmt.Printf("setAge.age: %v\n", *age) } func main() { age := 18 fmt.Printf("main.age pointer is: %p, value: %d\n", &age, age) setAge(&age) fmt.Printf("main.age: %v\n", age) } // 運行結果: // main.age pointer is: 0xc0000ba000, value: 18 // setAge.age pointer is: 0xc0000ba000, value: 18 // setAge.age: 19 // main.age: 19 ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看