<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之旅 廣告
                Go中的方法能給用戶自定義的類型添加新的行為。它和函數的區別在于方法有一個接收者,給一個函數添加一個接收者,那么它就變成了方法。接收者可以是值接收者,也可以是指針接收者。 在調用方法的時候,值類型既可以調用值接收者的方法,也可以調用指針接收者的方法;指針類型既可以調用指針接收者的方法,也可以調用值接收者的方法。 也就是說,不管方法的接收者是什么類型,該類型的值和指針都可以調用,不必嚴格符合接收者的類型。 ~~~go package main import "fmt" type Person struct { age int } func (p Person) Elegance() int { return p.age } func (p *Person) GetAge() { p.age += 1 } func main() { // p1 是值類型 p := Person{age: 18} // 值類型 調用接收者也是值類型的方法 fmt.Println(p.howOld()) // 值類型 調用接收者是指針類型的方法 p.GetAge() fmt.Println(p.GetAge()) // ---------------------- // p2 是指針類型 p2 := &Person{age: 100} // 指針類型 調用接收者是值類型的方法 fmt.Println(p2.GetAge()) // 指針類型 調用接收者也是指針類型的方法 p2.GetAge() fmt.Println(p2.GetAge()) } ~~~ 運行 ~~~go 18 19 100 101 ~~~ | 函數和方法 | 值接收者 | 指針接收者 | | --- | --- | --- | | 值類型調用者 | 方法會使用調用者的一個副本,類似于“傳值” | 使用值的引用來調用方法,上例中,p1.GetAge() 實際上是 (&p1).GetAge(). | | 指針類型調用者 | 指針被解引用為值,上例中,p2.GetAge()實際上是 (\*p1).GetAge() | 實際上也是“傳值”,方法里的操作會影響到調用者,類似于指針傳參,拷貝了一份指針 | 如果實現了接收者是值類型的方法,會隱含地也實現了接收者是指針類型的方法。 如果方法的接收者是值類型,無論調用者是對象還是對象指針,修改的都是對象的副本,不影響調用者;如果方法的接收者是指針類型,則調用者修改的是指針指向的對象本身。 通常我們使用指針作為方法的接收者的理由: * 使用指針方法能夠修改接收者指向的值。 * 可以避免在每次調用方法時復制該值,在值的類型為大型結構體時,這樣做會更加高效。 因而呢,我們是使用值接收者還是指針接收者,不是由該方法是否修改了調用者(也就是接收者)來決定,而是應該基于該類型的本質。 如果類型具備“原始的本質”,也就是說它的成員都是由 Go 語言里內置的原始類型,如字符串,整型值等,那就定義值接收者類型的方法。像內置的引用類型,如 slice,map,interface,channel,這些類型比較特殊,聲明他們的時候,實際上是創建了一個 header, 對于他們也是直接定義值接收者類型的方法。這樣,調用函數時,是直接 copy 了這些類型的 header,而 header 本身就是為復制設計的。 如果類型具備非原始的本質,不能被安全地復制,這種類型總是應該被共享,那就定義指針接收者的方法。比如 go 源碼里的文件結構體(struct File)就不應該被復制,應該只有一份實體。 接口值的零值是指動態類型和動態值都為 nil。當僅且當這兩部分的值都為 nil 的情況下,這個接口值就才會被認為 接口值 == nil。
                  <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>

                              哎呀哎呀视频在线观看