go入門(五) 2018-07-19

方法和接口

方法

Go語言中沒有類吱抚,但是可以在結(jié)構(gòu)類型上定義方法逝钥,實(shí)際上可以對(duì)包中的任意類型定義任意方法,但是不能對(duì)來自其他包的類型或基礎(chǔ)數(shù)據(jù)類型來定義方法

方法的接收者

方法的接收者可以是指針類型,也可以是值類型

為什么要使用指針作為方法的接收者俏竞?

- 避免在每個(gè)方法調(diào)用中拷貝值
- 方法可以修改接收者指向的值

兩種實(shí)現(xiàn)方式的對(duì)比

package main

import (
    "fmt"
    "math"
)

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Scale(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X * v.X + v.Y * v.Y)
}

func main() {
    v := &Vertex{3, 4}
    v.Scale(5)
    fmt.Println(v, v.Abs())    // &{15 20} 25
}


import (
    "fmt"
    "math"
)

type Vertex struct {
    X, Y float64
}

func (v Vertex) Scale(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

func (v Vertex) Abs() float64 {
    return math.Sqrt(v.X * v.X + v.Y * v.Y)
}

func main() {
    v := &Vertex{3, 4}
    v.Scale(5)
    fmt.Println(v, v.Abs())    // &{3 4} 5
}

對(duì)比傳值和傳地址的結(jié)果出皇,可以發(fā)現(xiàn)傳值的方式讀入的v是v的副本羞芍,因而無法修改原始值,經(jīng)過scale之后v的原始值并沒有發(fā)生變化

接口

接口類型是由一組方法構(gòu)成的集合郊艘,任何實(shí)現(xiàn)了接口中所有的方法的值都可以用接口的值來接收

package main

import (
    "fmt"
    "math"
)

type Abser interface {
    Abs() float64
}

type MyFloat float64

func (f MyFloat) Abs() float64 {
    if (f < 0) {
        return float64(-f)
    }
    return float64(f)
}

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X * v.X + v.Y * v.Y)
}

func main() {
    var a Abser
    f := MyFloat(math.Sqrt2)
    v := Vertex{3, 4}

    a = f
    fmt.Println(a.Abs())
    a = &v
    fmt.Println(a.Abs())
}

接口的實(shí)現(xiàn)是隱式的荷科,隱式接口解耦了實(shí)現(xiàn)接口的包和定義接口的包唯咬,互不依賴

空接口

interface{}空接口是指不包含任何方法的接口,空接口可以接收任何類型畏浆。常用來處理類型未知的值

空接口結(jié)合switch進(jìn)行類型匹配

package main

import (
    "fmt"
)

func identifyType(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Println("An int:", v)
    case float64:
        fmt.Println("A float64:", v)
    case string:
        fmt.Println("A string:", v, "length =", len(v))
    case bool:
        fmt.Println("A bool:", v)
    case rune:
        fmt.Println("A rune:", string(v))
    default:
        fmt.Printf("Unknown type: %T(%v)\n", v, v)
    }
}

type Vertex struct {
    X, Y float64
}

var pt Vertex = Vertex{1, 2}

var i interface{} = map[int]string{1: "hello", 2: "bye"}

func main() {
    identifyType(1200)
    identifyType(12.21)
    identifyType("hello")
    identifyType(true)
    identifyType('p')
    identifyType(func()int{return 1})
    identifyType([]int{1, 2, 3})
    identifyType(map[string]int{"hello": 100, "world": 200})
    identifyType(pt)
    identifyType(i)
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胆胰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子刻获,更是在濱河造成了極大的恐慌蜀涨,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件将鸵,死亡現(xiàn)場(chǎng)離奇詭異勉盅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)顶掉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門草娜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人痒筒,你說我怎么就攤上這事宰闰。” “怎么了簿透?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵移袍,是天一觀的道長。 經(jīng)常有香客問我老充,道長葡盗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任啡浊,我火速辦了婚禮觅够,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巷嚣。我一直安慰自己喘先,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布廷粒。 她就那樣靜靜地躺著窘拯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坝茎。 梳的紋絲不亂的頭發(fā)上涤姊,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音嗤放,去河邊找鬼思喊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛斤吐,可吹牛的內(nèi)容都是我干的搔涝。 我是一名探鬼主播厨喂,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼庄呈!你這毒婦竟也來了蜕煌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤诬留,失蹤者是張志新(化名)和其女友劉穎斜纪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體文兑,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盒刚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绿贞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片因块。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖籍铁,靈堂內(nèi)的尸體忽然破棺而出涡上,到底是詐尸還是另有隱情,我是刑警寧澤拒名,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布吩愧,位于F島的核電站,受9級(jí)特大地震影響增显,放射性物質(zhì)發(fā)生泄漏雁佳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一同云、第九天 我趴在偏房一處隱蔽的房頂上張望糖权。 院中可真熱鬧,春花似錦梢杭、人聲如沸温兼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至荡含,卻和暖如春咒唆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背释液。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工全释, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人误债。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓浸船,卻偏偏與公主長得像妄迁,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子李命,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔登淘,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,754評(píng)論 2 9
  • 方法和接口 第四篇包含了方法和接口封字,可以用它們來定義對(duì)象和其行為黔州;以及如何將所有內(nèi)容貫通起來。 方法 Go 沒有類...
    張洋銘Ocean閱讀 1,482評(píng)論 2 0
  • 從小到大一直都有寫作文阔籽,但在之前的學(xué)習(xí)中一直沒有十分系統(tǒng)的流妻、專業(yè)的去好好學(xué)習(xí)作文。直到大學(xué)學(xué)習(xí)了半個(gè)學(xué)期的...
    一只毛豆xm閱讀 248評(píng)論 2 1
  • 離2017年還剩下30天笆制。 朋友圈里有個(gè)有趣的段子說最恐怖的故事是還剩下30天绅这,就是新的一年了。 昨晚和幾個(gè)小伙伴...
    車馬正簡閱讀 221評(píng)論 7 2
  • 一在辆、概述 當(dāng)子類需要父類的功能君躺,而子類有新的內(nèi)容,可以重寫父類中的方法开缎。在實(shí)際開發(fā)過程中棕叫,隨著代碼量的逐漸增加,維...
    叢鵬閱讀 123評(píng)論 0 0