<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                Golang 表達式 :根據調用者不同,方法分為兩種表現形式: ~~~ instance.method(args...) ---> <type>.func(instance, args...) ~~~ 前者稱為 method value,后者 method expression。 兩者都可像普通函數那樣賦值和傳參,區別在于 method value 綁定實例,而 method expression 則須顯式傳參。 ~~~ package main import "fmt" type User struct { id int name string } func (self *User) Test() { fmt.Printf("%p, %v\n", self, self) } func main() { u := User{1, "Tom"} u.Test() mValue := u.Test mValue() // 隱式傳遞 receiver mExpression := (*User).Test mExpression(&u) // 顯式傳遞 receiver } ~~~ 輸出結果: ~~~ 0xc42000a060, &{1 Tom} 0xc42000a060, &{1 Tom} 0xc42000a060, &{1 Tom} ~~~ 需要注意,method value 會復制 receiver。 ~~~ package main import "fmt" type User struct { id int name string } func (self User) Test() { fmt.Println(self) } func main() { u := User{1, "Tom"} mValue := u.Test // 立即復制 receiver,因為不是指針類型,不受后續修改影響。 u.id, u.name = 2, "Jack" u.Test() mValue() } ~~~ 輸出結果: ~~~ {2 Jack} {1 Tom} ~~~ 在匯編層面,method value 和閉包的實現方式相同,實際返回 FuncVal 類型對象。 ~~~ FuncVal { method_address, receiver_copy } ~~~ 可依據方法集轉換 method expression,注意 receiver 類型的差異。 ~~~ package main import "fmt" type User struct { id int name string } func (self *User) TestPointer() { fmt.Printf("TestPointer: %p, %v\n", self, self) } func (self User) TestValue() { fmt.Printf("TestValue: %p, %v\n", &self, self) } func main() { u := User{1, "Tom"} fmt.Printf("User: %p, %v\n", &u, u) mv := User.TestValue mv(u) mp := (*User).TestPointer mp(&u) mp2 := (*User).TestValue // *User 方法集包含 TestValue。簽名變為 func TestValue(self *User)。實際依然是 receiver value copy。 mp2(&u) } ~~~ 輸出: ~~~ User: 0xc42000a060, {1 Tom} TestValue: 0xc42000a0a0, {1 Tom} TestPointer: 0xc42000a060, &{1 Tom} TestValue: 0xc42000a100, {1 Tom} ~~~ 將方法 "還原" 成函數,就容易理解下面的代碼了。 ~~~ package main type Data struct{} func (Data) TestValue() {} func (*Data) TestPointer() {} func main() { var p *Data = nil p.TestPointer() (*Data)(nil).TestPointer() // method value (*Data).TestPointer(nil) // method expression // p.TestValue() // invalid memory address or nil pointer dereference // (Data)(nil).TestValue() // cannot convert nil to type Data // Data.TestValue(nil) // cannot use nil as type Data in function argument } ~~~
                  <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>

                              哎呀哎呀视频在线观看