Go語言方法和接口

  • 定義一個結(jié)構(gòu)體,將函數(shù)和結(jié)構(gòu)體綁定在一起的東西就是方法

  • 格式:
    func (接收者名稱 接收者類型)函數(shù)名稱(形參列表)(返回值列表){
    邏輯語句;
    }

  • Go語言中的函數(shù)可以和任何類型綁定, 但是一般用于和結(jié)構(gòu)體綁定

  • 注意點:

    1.方法和函數(shù)的區(qū)別在于, 函數(shù)可以直接調(diào)用(通過包名.函數(shù)名稱), 而方法只能通過綁定的數(shù)據(jù)類型對應(yīng)的變量來調(diào)用(變量.函數(shù)名稱)

    2.函數(shù)名稱和方法名稱可以重名

type Person struct{
  name string
  age int
}
func (Person)say(){
  fmt.Printf("Hello")
}

p := Person{"xxz",18}
p.say()//"Hello"
  • 如果指定了接收者名稱,那么調(diào)用方法時會將調(diào)用者傳遞給接收者
    • 簡單理解:可以把接收者看做函數(shù)的形參
  • 以下第一段代碼表示的是值傳遞
type Person struct{
  name string
  age int
}
func (per Person)say(){
  fmt.Println("Hello",per.name)
}
p := Person{"xxz",18}
p.say()//"Hello xxz"
  • 以下代碼為地址傳遞
  • 如果為以下代碼,那么編譯器會自動將結(jié)構(gòu)體的地址取出來傳遞給函數(shù)
type Person struct{
  name string
  age int
}
func (per *Person)setAge(age int){
  per.age = age
}

per := Person{"xxz",18}
per.say()//"Hello xxz"
//p := &per
//(*p).setAge(666)
per.setAge(666) // 底層相當(dāng)于(&per).setAge(666)
fmt.Println(per)//{"xxz",666}

Go語言接口

  • 1.如何定義一個接口

    type USB interface {
    函數(shù)名稱(形參列表)(返回值列表)
    函數(shù)名稱(形參列表)(返回值列表)
    }

  • 接口內(nèi)只實現(xiàn)了函數(shù)的聲明,沒有實現(xiàn)

  • Go語言中實現(xiàn)一個接口, 不需要做額外的聲明, 只要某種數(shù)據(jù)類型綁定了所有接口中的方法就是實現(xiàn)了這個接口

  • 實現(xiàn)接口之后的特性

    • 只要某種數(shù)據(jù)類型實現(xiàn)了接口, 那么就可以使用接口變量保存這種數(shù)據(jù)類型

    • 只要某種數(shù)據(jù)類型實現(xiàn)了接口, 那么就可以使用接口變量調(diào)用接口中聲明的方法

/*
需求:定義一個函數(shù),實現(xiàn)電器的打開和關(guān)閉
*/
type USB interface{
  start()
  end()
}
type Computer struct{
  name string
}
func (c Computer)start(){
  fmt.Println(c.name,"被打開了")
}
func (c Computer)end(){
  fmt.Println(c.name,"被關(guān)閉了")
}

type Phone struct{
  name string
}
func (ph Phone)start(){
  fmt.Println(ph.name,"被打開了")
}
func (ph Phone)end(){
  fmt.Println(ph.name,"被關(guān)閉了")
}

func main(){
  var in USB
  var cm Computer = Computer{"三星"}
  Option(cm)
  var ph Phone = Phone{"蘋果"}
  Option(ph)
}
function Option(in USB){
  in.start()
  in.end()
}
  • 注意點
    1.接口中只能有方法的聲明, 不能有方法的實現(xiàn)

    2.接口中只能有方法的聲明, 不能有變量的聲明

    3.只有實現(xiàn)了接口中聲明的所有方法, 才算實現(xiàn)了接口, 才能使用接口變量保存

    4.在實現(xiàn)接口的時候, 方法名稱,形參列表,返回值列表必須一模一樣

    5.接口和結(jié)構(gòu)體一樣, 可以嵌套

    6.接口和結(jié)構(gòu)體一樣, 嵌套時不能嵌套自己(自己搞自己)

    7.可以將集接口變量賦值給子集接口變量,不可以將子集接口變量賦值給超集接口變量(無論實際的數(shù)據(jù)類型是否已經(jīng)實現(xiàn)了超集的所有方法)

    8.接口中不能出現(xiàn)同名的方法聲明


空接口

  • 空接口相當(dāng)于其他語言的Object類型
  • 空接口可以保存任何類型的數(shù)據(jù)
var value interface{}
  • 數(shù)組和字典一般是用來保存相同類型數(shù)據(jù)的,但是我們可以利用空接口使它們保存不同的類型的數(shù)據(jù)
var arr [3]interface{}
arr[0] = 1
arr[1] = "lnj"
arr[2] = false
fmt.Println(arr)

接口類型轉(zhuǎn)換(類型斷言)

  • 當(dāng)一個結(jié)構(gòu)體實現(xiàn)了中所有的方法,那么我們稱這個結(jié)構(gòu)體實現(xiàn)了這個接口
  • 當(dāng)一個結(jié)構(gòu)體實現(xiàn)了這個接口,我們可以通過接口變量來保存這個結(jié)構(gòu)體變量
  • 當(dāng)這個接口變量保存了這個結(jié)構(gòu)體變量,那么可以通過調(diào)用接口的方法來實現(xiàn)結(jié)構(gòu)體調(diào)用這個方法
  • 但是接口變量不能調(diào)用接口中沒有的方法,也不能調(diào)用結(jié)構(gòu)體的屬性,要想調(diào)用接口以外的方法和變量,我們只能通過接口類型轉(zhuǎn)換來實現(xiàn)

  • 方法一:
    通過value,ok := 接口變量名稱.(具體數(shù)據(jù)類型)
  • 轉(zhuǎn)換成功ok值為True,value拿到轉(zhuǎn)換后的結(jié)構(gòu)體
  • 轉(zhuǎn)換的類型和接口保存的類型不一樣時ok為false
type USB interface{
  start()
}

type Computer struct{
  name string
}
func (cm Computer)start(){
  fmt.Println(cm.name,"被打開了")
}

func main(){
  var cm Computer = Computer{"華碩"}
  in USB := cm
  //fmt.Println(in.name) 報錯
  value,ok := in.(Computer)
  fmt.Println(value.name)//"華碩"
  fmt.Println(ok)//True
}
  • 方法二
    通過 value := 接口變量名.(type)配合switch
  • 會將接口類型變量轉(zhuǎn)換為對應(yīng)的原始類型之后賦值給value
cm := 接口變量名.(type)
    switch cm := in.(type) {
    case Computer:
        fmt.Println(cm)
        cm.say()
    default:
        fmt.Println("不是Person類型")
    }
cm := Computer{"惠普"}
    var sce []interface{} = []interface{}{1, 3.14, false, "lnj", cm}
    // 需求: 獲取切片中保存的每一個數(shù)據(jù)的原始類型
    for key, value := range sce {
        switch temp := value.(type) {
        case int:
            fmt.Println("第",key, "個元素是int類型")
        case float64:
            fmt.Println("第",key, "個元素是float64類型")
        case bool:
            fmt.Println("第",key, "個元素是bool類型")
        case string:
            fmt.Println("第",key, "個元素是string類型")
        case Computer:
            fmt.Println("第",key, "個元素是Computer類型")
            temp.say()
        }
    }
  • 方法三:
    定義一個類似與轉(zhuǎn)接口的空接口用來保存要調(diào)用的屬性或方法所在的結(jié)構(gòu)體的類型
  • 第一種:把抽象接口類型轉(zhuǎn)換為具體的接口類型
  • 第二種:把抽象的接口類型轉(zhuǎn)換為結(jié)構(gòu)體類型
var in interface{} = Computer{"華碩"}
//第一種
if value,ok := in.(USB);ok{
  value.start()
}
//第二種
if value,ok := in.(Computer);ok{
  value.start()
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悠瞬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子淘衙,更是在濱河造成了極大的恐慌宏娄,老刑警劉巖政钟,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡驶冒,警方通過查閱死者的電腦和手機儒士,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門的止,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人着撩,你說我怎么就攤上這事诅福∝椅” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵氓润,是天一觀的道長赂乐。 經(jīng)常有香客問我,道長咖气,這世上最難降的妖魔是什么挨措? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮崩溪,結(jié)果婚禮上浅役,老公的妹妹穿的比我還像新娘。我一直安慰自己伶唯,他們只是感情好觉既,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抵怎,像睡著了一般奋救。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上反惕,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天尝艘,我揣著相機與錄音,去河邊找鬼姿染。 笑死背亥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悬赏。 我是一名探鬼主播狡汉,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闽颇!你這毒婦竟也來了盾戴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤兵多,失蹤者是張志新(化名)和其女友劉穎尖啡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剩膘,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡衅斩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了怠褐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畏梆。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奠涌,到底是詐尸還是另有隱情宪巨,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布铣猩,位于F島的核電站揖铜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏达皿。R本人自食惡果不足惜天吓,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望峦椰。 院中可真熱鬧龄寞,春花似錦、人聲如沸汤功。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滔金。三九已至色解,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間餐茵,已是汗流浹背科阎。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留忿族,地道東北人锣笨。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像道批,于是被迫代替她去往敵國和親错英。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Go語言方法 概念 Go語言中的方法就是一個特殊的函數(shù), 這個函數(shù)和某種數(shù)據(jù)綁定在一起,就稱之為方法一般都是和結(jié)構(gòu)...
    超級皮波9閱讀 1,103評論 3 0
  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔隆豹,今天18年5月份再次想寫文章椭岩,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,762評論 2 9
  • 上一章目錄下一章“老師,大概就是這樣璃赡,我覺得自己是對的簿煌,可是大家不這么認(rèn)為,我又想和大家一起玩鉴吹,所以我只能那樣做,...
    蟄一閱讀 178評論 0 0
  • 愛情不是羈絆 卻終歸阻礙了你的自由 若一天我離開或死去 請忘了我 繼續(xù)你自由的生活 我給你的愛是我的全部 卻不曾想...
    瓊圖閱讀 437評論 0 1
  • 昨天媽媽打電話過來惩琉,讓我從網(wǎng)上給爸爸買個電動理發(fā)器豆励,正忙于工作的我隨口應(yīng)了下來,以至于忙完也忘了,今早上處理好手頭...
    愛上樹的老螞蟻閱讀 224評論 0 1