Go語言 方法和接口的知識點

Go語言方法

  • 概念

Go語言中的方法就是一個特殊的函數, 這個函數和某種數據綁定在一起,就稱之為方法
一般都是和結構體之間綁定

  • 方法格式
func(接受者名稱 接受者類型)函數名稱(形參列表)(返回值列表){
        執行語句
    }
  • 第一種
package main

import "fmt"

//定義了一個Person的結構體
type Person struct{
    name string
    age int
}
//定義了一個say方法和 Person 綁定在一起
func(Person)say(){
    fmt.Println("hello world")
}

func main() {

}
  • 第二種 指定接收者名稱
package main

import "fmt"

//定義了一個Person的結構體
type Person struct{
    name string
    team string
}
//定義了一個say方法和 Person 綁定在一起
func(p Person)say(){
    fmt.Println(p.name,p.team)
}

func main() {

    var people Person = Person{"范佩西","費耶諾德"}
    
    people.say()   // 方法只能通過綁定數據類型對應的變量來調用


}
  • 方法只能通過綁定數據類型對應的變量來調用
  • 如果指定接受者名稱 , 調用的方法的時候會將調用者傳給接收者
  • 可以理解 接收者 看作函數的一個參數
微信圖片_20180927170805.png

既然作為參數傳遞就涉及到地址傳遞 值傳遞

  • 值傳遞
package main

import "fmt"

//定義了一個Person的結構體
type Person struct{
    name string
    team string
}
//定義普通方法
func (p Person)setName(name string){
    p.name = name
}

func main() {

    var people Person = Person{"范佩西","費耶諾德"}

    people.setName("亨利")

    fmt.Println(people)   //打印 {范佩西 費耶諾德}

}
  • 地址傳遞
package main

import "fmt"

//定義了一個Person的結構體
type Person struct{
    name string
    team string
}

//定義指針類型的接收者的方法
func (p *Person)setTeam(team string){
    (*p).team = team
}

func main() {

    var people Person = Person{"范佩西","費耶諾德"}

    p := &people
    
    p.setTeam("阿森納")

    fmt.Println(people)   //打印 {范佩西 阿森納}

}

函數和方法比較

1. 方法和函數都是 函數類型 所以也可以定義變量保存方法

package main

import "fmt"

//定義了一個Person的結構體
type Person struct{
    name string
    team string
}

//定義的方法
func (p Person)sayTeam(){
    fmt.Println(p.team)
}

func main() {

    var people Person = Person{"范佩西","費耶諾德"}

    var fn func ()

    fn = people.sayTeam   

    fn()    // 費耶諾德

}

2. 函數通過 包名.函數名稱() 調用 方法通過 變量.方法名稱() 調用
3. 函數名稱和方法名稱可以相同 因為函數是獨立的
4. 接收者可以看作是方法的一個參數,這個參數區分 值傳遞和地址傳遞
5. 接收者地址傳遞的兩種方法

(*指針變量名).方法名( )
普通變量名.方法名( )
  • 只要接受者是指針類型,那么編譯器就會自動把普通變量地址取出來給 接收者
package main

import "fmt"

//定義了一個Person的結構體
type Person struct{
    name string
    team string
}

//定義指針類型的接收者的方法
func (p *Person)setTeam(team string){
    (*p).team = team
}

func main() {

    var people Person = Person{"范佩西","費耶諾德"}

    people.setTeam("阿森納")  // &people . setTeam()

    fmt.Println(people)   //打印 {范佩西 阿森納}

}

Go語言的接口

概念

  • GO語言的接口就是用于定義某種規范, 只要使用者按照接口定義的規范就可以使用

接口的作用

  • 在Go語言中接口專門用于定義函數的聲明
  • 從而規定函數的名稱 ,函數的形參 ,函數的返回值

接口的定義格式

type 接口名稱 interface{
    
    方法名()
    
}
  • 注意點
  1. 接口是虛的,只能有方法的聲明,沒有方法的實現
  2. 接口中聲明的方法,只能通過和某種該數據綁定的方法來實現,不能通過函數的格式實現
  3. 在GO語言中,只要某個數據類型實現了接口中聲明的所有方法,那么就代表這個數據類型實現了這個接口
  4. 只要一個數據類型實現了某個接口, 那么就可以使用這個接口類型的變量來保存這個類型的數據
  5. 同樣的只要一個數據類型實現了某個接口, 那么保存這個類型之后, 就可以使用接口類型變量調用接口中的方法
  • 案例
package main

import "fmt"

//定義一個接口 interface == 接口
type intface interface{
    //定義方法格式
    start(name string)
    end(name string)
}
//定義一個結構體
type Phone struct {

}
//定義start方法
func (Phone)start(name string){
    fmt.Println(name,"啟動了")
}
//定義end方法
func (Phone)end(name string){
    fmt.Println(name,"關閉了")
}

func main() {

    //定義一個實現接口數據類型的變量
    var ph Phone = Phone{}
    //頂一個接口類型的變量
    var in intface

    in = ph

    in.start("Oppo")  // Oppo 啟動了
    in.end("Oppo")   // Oppo 關閉了
    
}
  • 圖片簡解
微信圖片_20180927181737.png
  • 其他注意點
  1. 接口中只能有方法的聲明 不能有變量的聲明
  2. 只有實現了接口中聲明的所有方法,才算實現了接口,才能使用接口變量保存
  3. 在實現接口的時候,方法名稱,形參列表,返回值列表必須一樣
  4. 接口和結構體一樣可以嵌套
  5. 接口和結構體一樣,嵌套時不能嵌套自己
  6. 可以將超集接口變量賦值給子集接口變量, 不可以將子集接口變量賦值給超集接口變量
  7. 任何情況接口中不能出現同名的方法聲明

空接口

  • Go語言的空接口可以充當任何類型的數據
  • 空接口格式
interface{ }
  • 定義空接口
var value interface{}

value = 1

注意點

  • 空接口類型可以讓數組和切片保存不同數據類型的數據
package main

import "fmt"

func main() {

    var arr[3]interface{}

    arr[0] = "亨利"
    arr[1] = 32
    arr[2] = false

    fmt.Println(arr) // [亨利 32 false]
    
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容