<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之旅 廣告
                Golang 方法總是綁定對象實例,并隱式將實例作為第一實參 (receiver)。 ~~~ ? 只能為當前包內命名類型定義方法。 ? 參數 receiver 可任意命名。如方法中未曾使用 ,可省略參數名。 ? 參數 receiver 類型可以是 T 或 *T。基類型 T 不能是接口或指針。 ? 不支持方法重載,receiver 只是參數簽名的組成部分。 ? 可用實例 value 或 pointer 調用全部方法,編譯器自動轉換。 ~~~ 一個方法就是一個包含了接受者的函數,接受者可以是命名類型或者結構體類型的一個值或者是一個指針。 所有給定類型的方法屬于該類型的方法集。 方法定義: ~~~ func (recevier type) methodName(參數列表)(返回值列表){} 參數和返回值可以省略 ~~~ ~~~ package main type Test struct{} // 無參數、無返回值 func (t Test) method0() { } // 單參數、無返回值 func (t Test) method1(i int) { } // 多參數、無返回值 func (t Test) method2(x, y int) { } // 無參數、單返回值 func (t Test) method3() (i int) { return } // 多參數、多返回值 func (t Test) method4(x, y int) (z int, err error) { return } // 無參數、無返回值 func (t *Test) method5() { } // 單參數、無返回值 func (t *Test) method6(i int) { } // 多參數、無返回值 func (t *Test) method7(x, y int) { } // 無參數、單返回值 func (t *Test) method8() (i int) { return } // 多參數、多返回值 func (t *Test) method9(x, y int) (z int, err error) { return } func main() {} ~~~ 下面定義一個結構體類型和該類型的一個方法: ~~~ package main import ( "fmt" ) //結構體 type User struct { Name string Email string } //方法 func (u User) Notify() { fmt.Printf("%v : %v \n", u.Name, u.Email) } func main() { // 值類型調用方法 u1 := User{"golang", "golang@golang.com"} u1.Notify() // 指針類型調用方法 u2 := User{"go", "go@go.com"} u3 := &u2 u3.Notify() } ~~~ 輸出結果: ~~~ golang : golang@golang.com go : go@go.com ~~~ 解釋: 首先我們定義了一個叫做 User 的結構體類型,然后定義了一個該類型的方法叫做 Notify,該方法的接受者是一個 User 類型的值。要調用 Notify 方法我們需要一個 User 類型的值或者指針。 在這個例子中當我們使用指針時,Go 調整和解引用指針使得調用可以被執行。注意,當接受者不是一個指針時,該方法操作對應接受者的值的副本(意思就是即使你使用了指針調用函數,但是函數的接受者是值類型,所以函數內部操作還是對副本的操作,而不是指針操作。 我們修改 Notify 方法,讓它的接受者使用指針類型: ~~~ package main import ( "fmt" ) //結構體 type User struct { Name string Email string } //方法 func (u *User) Notify() { fmt.Printf("%v : %v \n", u.Name, u.Email) } func main() { // 值類型調用方法 u1 := User{"golang", "golang@golang.com"} u1.Notify() // 指針類型調用方法 u2 := User{"go", "go@go.com"} u3 := &u2 u3.Notify() } ~~~ 輸出結果: ~~~ golang : golang@golang.com go : go@go.com ~~~ 注意:當接受者是指針時,即使用值類型調用那么函數內部也是對指針的操作。 方法不過是一種特殊的函數,只需將其還原,就知道 receiver T 和 *T 的差別。 ~~~ package main import "fmt" type Data struct { x int } func (self Data) ValueTest() { // func ValueTest(self Data); fmt.Printf("Value: %p\n", &self) } func (self *Data) PointerTest() { // func PointerTest(self *Data); fmt.Printf("Pointer: %p\n", self) } func main() { d := Data{} p := &d fmt.Printf("Data: %p\n", p) d.ValueTest() // ValueTest(d) d.PointerTest() // PointerTest(&d) p.ValueTest() // ValueTest(*p) p.PointerTest() // PointerTest(p) } ~~~ 輸出: ~~~ Data: 0xc42007c008 Value: 0xc42007c018 Pointer: 0xc42007c008 Value: 0xc42007c020 Pointer: 0xc42007c008 ~~~ 普通函數與方法的區別 1.對于普通函數,接收者為值類型時,不能將指針類型的數據直接傳遞,反之亦然。 2.對于方法(如struct的方法),接收者為值類型時,可以直接用指針類型的變量調用方法,反過來同樣也可以。 ~~~ package main //普通函數與方法的區別(在接收者分別為值類型和指針類型的時候) import ( "fmt" ) //1.普通函數 //接收值類型參數的函數 func valueIntTest(a int) int { return a + 10 } //接收指針類型參數的函數 func pointerIntTest(a *int) int { return *a + 10 } func structTestValue() { a := 2 fmt.Println("valueIntTest:", valueIntTest(a)) //函數的參數為值類型,則不能直接將指針作為參數傳遞 //fmt.Println("valueIntTest:", valueIntTest(&a)) //compile error: cannot use &a (type *int) as type int in function argument b := 5 fmt.Println("pointerIntTest:", pointerIntTest(&b)) //同樣,當函數的參數為指針類型時,也不能直接將值類型作為參數傳遞 //fmt.Println("pointerIntTest:", pointerIntTest(&b)) //compile error:cannot use b (type int) as type *int in function argument } //2.方法 type PersonD struct { id int name string } //接收者為值類型 func (p PersonD) valueShowName() { fmt.Println(p.name) } //接收者為指針類型 func (p *PersonD) pointShowName() { fmt.Println(p.name) } func structTestFunc() { //值類型調用方法 personValue := PersonD{101, "hello world"} personValue.valueShowName() personValue.pointShowName() //指針類型調用方法 personPointer := &PersonD{102, "hello golang"} personPointer.valueShowName() personPointer.pointShowName() //與普通函數不同,接收者為指針類型和值類型的方法,指針類型和值類型的變量均可相互調用 } func main() { structTestValue() structTestFunc() } ~~~ 輸出結果: ~~~ valueIntTest: 12 pointerIntTest: 15 hello world hello world hello golang hello golang ~~~
                  <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>

                              哎呀哎呀视频在线观看