Golang學(xué)習(xí)筆記之方法(method)

如果對(duì)與結(jié)構(gòu)體還有什么疑問的可以看一下Golang學(xué)習(xí)筆記之結(jié)構(gòu)體

?法總是綁定對(duì)象實(shí)例着帽,并隱式將實(shí)例作為第?實(shí)參 (receiver)。

? 只能為當(dāng)前包內(nèi)命名類型定義?法竿秆。
? 參數(shù) receiver 可任意命名启摄。如?法中未曾使?,可省略參數(shù)名幽钢。
? 參數(shù) receiver 類型可以是 T 或 *T「凳牵基類型 T 不能是接?或指針匪燕。
? 不?持?法重載, receiver 只是參數(shù)簽名的組成部分喧笔。
? 可?實(shí)例 value 或 pointer 調(diào)?全部?法帽驯,編譯器?動(dòng)轉(zhuǎn)換。
? Go 不允許同名函數(shù)书闸,但是同名方法可以定義在不同的類型上
? method和receiver必須在同一個(gè)包里定義
? 作為函數(shù)參數(shù)尼变,值類型就是值類型,指針類型就是指針類型
? 方法有一個(gè)值類型和指針類型的接受者時(shí),都可以直接調(diào)用嫌术,內(nèi)部會(huì)
自動(dòng)進(jìn)行語(yǔ)法的轉(zhuǎn)換哀澈。

一個(gè)方法只是一個(gè)函數(shù),它有一個(gè)特殊的接收者(receiver)類型度气,該接收者放在 func 關(guān)鍵字和函數(shù)名之間割按。接收者可以是結(jié)構(gòu)體類型或非結(jié)構(gòu)體類型×准可以在方法內(nèi)部訪問接收者适荣。
一般語(yǔ)法為:

func (t receiver_type) methodName(parameter list) {}

一、參數(shù) receiver 類型可以是 T 或 *T院领。以指針為接收者也是可以的弛矛。
兩者的區(qū)別在于, 以*T為接收者時(shí)比然,方法內(nèi)部對(duì)其的修改對(duì)于外部有效丈氓,而以 T作為接受者時(shí),對(duì)于外部無(wú)效谈秫。
func (e Employee) changeName(newName string) {
    e.name = newName
}
func (e *Employee) changeAge(newAge int) {
    e.age = newAge
}
    emp1 := Employee{
        name:     "張三",
        salary:   6000,
        currency: "$",
        age:      18,
        Address:  Address{"山東", "濟(jì)南"},
    }
    emp1.displaySalary()

    fmt.Println("Before call changeName ", emp1.name)
    //修改名字扒寄,未發(fā)生變化因?yàn)槭侵祩鬟f
    emp1.changeName("zhangsan")
    fmt.Println("After call changeName ", emp1.name) //After call changeName  張三

    fmt.Println("Before change age", emp1.age)
    //利用指針來修改年齡
    emp1.changeAge(50)
    fmt.Println("After change age", emp1.age) //After change age 50
二、Go 不允許同名函數(shù)拟烫,但是同名方法可以定義在不同的類型上
//Rectangle 代碼規(guī)范
type Rectangle struct {
    width  float32
    height float32
}
//Circle 代碼規(guī)范
type Circle struct {
    radius float32
}
func (e Employee) changeName(newName string) {
    e.name = newName
}
func (e *Employee) changeAge(newAge int) {
    e.age = newAge
}
func main() {
    //計(jì)算面積
    re := Rectangle{20, 30}
    c := Circle{40}
    //兩個(gè)類型調(diào)用同名方法
    fmt.Println(re.getArea())
    fmt.Println(c.getArea())
}
三该编、提階,方法也支持提階
    emp1 := Employee{
        name:     "張三",
        salary:   6000,
        currency: "$",
        age:      18,
        Address:  Address{"山東", "濟(jì)南"},
    }
    //提階
    emp1.fullAddress()         //山東 濟(jì)南硕淑,提階相當(dāng)于直接訪問Address里的
    emp1.Address.fullAddress() //山東 濟(jì)南
四课竣、非結(jié)構(gòu)類型的方法

非結(jié)構(gòu)體類型也可以定義方法,不過這里需要注意一點(diǎn)置媳。為了定義某個(gè)類型的方法于樟,接收者類型的定義與方法的定義必須在同一個(gè)包中。

因?yàn)楸仨氃谝粋€(gè)包中而int則在main包中我們沒法去定義這個(gè)里為了簡(jiǎn)單直觀拇囊,給int聲明了別名

//非結(jié)構(gòu)體方法擴(kuò)展
type myInt int

func (a myInt) add(b myInt) myInt {
    return a + b
}
func main() {
    //調(diào)用擴(kuò)展的方法
    num1 := myInt(5)
    num2 := myInt(10)
    sum := num1.add(num2)
    fmt.Println("Sum is", sum)

}
下面附上完整實(shí)例程序
package main

import (
    "fmt"
    "math"
)

//Employee 需要添加注釋或者改成非導(dǎo)出變量(首字母小寫)
type Employee struct {
    name     string
    currency string
    salary   int
    age      int
    Address
}

//Address 代碼規(guī)范
type Address struct {
    city  string
    state string
}

//Rectangle 代碼規(guī)范
type Rectangle struct {
    width  float32
    height float32
}

//Circle 代碼規(guī)范
type Circle struct {
    radius float32
}

//Employee 的方法
func (e Employee) displaySalary() {
    fmt.Println(e)
}
func (e Employee) changeName(newName string) {
    e.name = newName
}
func (e *Employee) changeAge(newAge int) {
    e.age = newAge
}

//Address 的方法
func (add Address) fullAddress() {
    fmt.Println(add.city, add.state)
}

//Rectangle 的方法計(jì)算面積
func (r Rectangle) getArea() float32 {
    return r.width * r.height
}

//Circle  的方法
func (c Circle) getArea() float32 {
    return math.Pi * c.radius * c.radius
}

//非結(jié)構(gòu)體方法擴(kuò)展
type myInt int

func (a myInt) add(b myInt) myInt {
    return a + b
}
func main() {
    //調(diào)用方法
    emp1 := Employee{
        name:     "張三",
        salary:   6000,
        currency: "$",
        age:      18,
        Address:  Address{"山東", "濟(jì)南"},
    }
    emp1.displaySalary()

    fmt.Println("Before call changeName ", emp1.name)
    //修改名字迂曲,未發(fā)生變化因?yàn)槭侵祩鬟f
    emp1.changeName("zhangsan")
    fmt.Println("After call changeName ", emp1.name) //After call changeName  張三

    fmt.Println("Before change age", emp1.age)
    //利用指針來修改年齡
    emp1.changeAge(50)
    fmt.Println("After change age", emp1.age) //After change age 50

    //提階
    emp1.fullAddress()         //山東 濟(jì)南,提階相當(dāng)于直接訪問Address里的
    emp1.Address.fullAddress() //山東 濟(jì)南

    //計(jì)算面積
    re := Rectangle{20, 30}
    c := Circle{40}
    //兩個(gè)類型調(diào)用同名方法
    fmt.Println(re.getArea())
    fmt.Println(c.getArea())

    //調(diào)用擴(kuò)展的方法
    num1 := myInt(5)
    num2 := myInt(10)
    sum := num1.add(num2)
    fmt.Println("Sum is", sum)

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寥袭,一起剝皮案震驚了整個(gè)濱河市路捧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌传黄,老刑警劉巖杰扫,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異膘掰,居然都是意外死亡章姓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凡伊,“玉大人零渐,你說我怎么就攤上這事〈吧” “怎么了相恃?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)笨觅。 經(jīng)常有香客問我拦耐,道長(zhǎng),這世上最難降的妖魔是什么见剩? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任杀糯,我火速辦了婚禮,結(jié)果婚禮上苍苞,老公的妹妹穿的比我還像新娘固翰。我一直安慰自己,他們只是感情好羹呵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布骂际。 她就那樣靜靜地躺著,像睡著了一般冈欢。 火紅的嫁衣襯著肌膚如雪歉铝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天凑耻,我揣著相機(jī)與錄音太示,去河邊找鬼。 笑死香浩,一個(gè)胖子當(dāng)著我的面吹牛类缤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邻吭,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼餐弱,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了囱晴?” 一聲冷哼從身側(cè)響起岸裙,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎速缆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恩闻,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艺糜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片破停。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翅楼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出真慢,到底是詐尸還是另有隱情毅臊,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布黑界,位于F島的核電站管嬉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏朗鸠。R本人自食惡果不足惜蚯撩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烛占。 院中可真熱鬧胎挎,春花似錦、人聲如沸忆家。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芽卿。三九已至揭芍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蹬竖,已是汗流浹背沼沈。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留币厕,地道東北人列另。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像旦装,于是被迫代替她去往敵國(guó)和親页衙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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