Go語言 方法和接口的知識(shí)點(diǎn)

Go語言方法

  • 概念

Go語言中的方法就是一個(gè)特殊的函數(shù), 這個(gè)函數(shù)和某種數(shù)據(jù)綁定在一起,就稱之為方法
一般都是和結(jié)構(gòu)體之間綁定

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

import "fmt"

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

func main() {

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

import "fmt"

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

func main() {

    var people Person = Person{"范佩西","費(fèi)耶諾德"}
    
    people.say()   // 方法只能通過綁定數(shù)據(jù)類型對應(yīng)的變量來調(diào)用


}
  • 方法只能通過綁定數(shù)據(jù)類型對應(yīng)的變量來調(diào)用
  • 如果指定接受者名稱 , 調(diào)用的方法的時(shí)候會(huì)將調(diào)用者傳給接收者
  • 可以理解 接收者 看作函數(shù)的一個(gè)參數(shù)
微信圖片_20180927170805.png

既然作為參數(shù)傳遞就涉及到地址傳遞 值傳遞

  • 值傳遞
package main

import "fmt"

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

func main() {

    var people Person = Person{"范佩西","費(fèi)耶諾德"}

    people.setName("亨利")

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

}
  • 地址傳遞
package main

import "fmt"

//定義了一個(gè)Person的結(jié)構(gòu)體
type Person struct{
    name string
    team string
}

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

func main() {

    var people Person = Person{"范佩西","費(fèi)耶諾德"}

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

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

}

函數(shù)和方法比較

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

package main

import "fmt"

//定義了一個(gè)Person的結(jié)構(gòu)體
type Person struct{
    name string
    team string
}

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

func main() {

    var people Person = Person{"范佩西","費(fèi)耶諾德"}

    var fn func ()

    fn = people.sayTeam   

    fn()    // 費(fèi)耶諾德

}

2. 函數(shù)通過 包名.函數(shù)名稱() 調(diào)用 方法通過 變量.方法名稱() 調(diào)用
3. 函數(shù)名稱和方法名稱可以相同 因?yàn)楹瘮?shù)是獨(dú)立的
4. 接收者可以看作是方法的一個(gè)參數(shù),這個(gè)參數(shù)區(qū)分 值傳遞和地址傳遞
5. 接收者地址傳遞的兩種方法

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

import "fmt"

//定義了一個(gè)Person的結(jié)構(gòu)體
type Person struct{
    name string
    team string
}

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

func main() {

    var people Person = Person{"范佩西","費(fèi)耶諾德"}

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

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

}

Go語言的接口

概念

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

接口的作用

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

接口的定義格式

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

import "fmt"

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

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

func main() {

    //定義一個(gè)實(shí)現(xiàn)接口數(shù)據(jù)類型的變量
    var ph Phone = Phone{}
    //頂一個(gè)接口類型的變量
    var in intface

    in = ph

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

空接口

  • Go語言的空接口可以充當(dāng)任何類型的數(shù)據(jù)
  • 空接口格式
interface{ }
  • 定義空接口
var value interface{}

value = 1

注意點(diǎn)

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

import "fmt"

func main() {

    var arr[3]interface{}

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

    fmt.Println(arr) // [亨利 32 false]
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,697評論 19 139
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,286評論 8 265
  • 文/小胖 松開時(shí)間的繩索,漫步在浪漫的秋日時(shí)光里,嗅著空氣里淺淺的桂花香氣,不經(jīng)意間,碎語的風(fēng),滑過街角的老梧桐,...
    一個(gè)叫小胖的姑娘閱讀 495評論 5 14
  • 導(dǎo)語 曾經(jīng)有一首吉他世界中的“名曲之名曲”叫做《阿爾罕布拉宮的回憶》,這是眾多吉他手必練的古典吉他獨(dú)奏曲。而在塞維...
    凡人思維閱讀 1,039評論 1 1
  • 1.不去分析追問,不試圖消除 不去追問為什么得強(qiáng)迫癥,不去分析小時(shí)候的經(jīng)歷生活,與父母的關(guān)系,不去回想某次...
    阿姣擦擦嘴閱讀 2,002評論 0 7

友情鏈接更多精彩內(nèi)容