Go語言之method-創(chuàng)新互聯(lián)

方法method

  • Go 中雖沒有class, 但依舊有method
  • 通過顯示說明receiver來實(shí)現(xiàn)與某個(gè)類型的組合
  • 只能為同一個(gè)包中的類型定義方法
  • receiver可以是類型的值或指針
  • 不存在方法重載
  • 可以使用值或者指針來調(diào)用方法,編譯器會(huì)自動(dòng)完成轉(zhuǎn)換
  • 從某種意義上來說,方法是函數(shù)的語法糖,因?yàn)閞eceiver其實(shí)就是方法所接收的第一個(gè)參數(shù)(Method Value vs. Method Express)
  • 如果外部結(jié)構(gòu)和嵌入結(jié)構(gòu)存在同名方法,則優(yōu)先調(diào)用外部結(jié)構(gòu)的方法
  • 類型別名不會(huì)擁有底層類型所附帶的方法
  • 方法可以調(diào)用結(jié)構(gòu)中的非公開字段

1、創(chuàng)建method

//創(chuàng)建方法
package main

import "fmt"

type book struct {
    Name string
}

type eleBook struct {
    Name string
}

func main() {
    //創(chuàng)建一個(gè)對象
    aBook := book{Name:"spark computer"}
    aBook.show()

    bBook := eleBook{Name:"k8s computer"}
    bBook.show()
}

//創(chuàng)建一個(gè)method
//此mothod方法屬于book類型
//(a book)  這個(gè)字段 是說
// 此方法,屬于哪類型,是跟類型綁定的
// (a book)就是一個(gè)receiver
//只能指定的類型的變量,才能調(diào)用
//方法的綁定,只能是同一個(gè)包中,才起作用
func (a book) show()  {
    fmt.Println("this is book:\t",a.Name)
}

// 這屬于重載了
//func (a book) show(info string)  {
//  fmt.Println("this is book")
//}

//創(chuàng)建一個(gè)method
//此mothod方法屬于eleBook類型
func (a eleBook) show()  {
    fmt.Println("this is ele book")
}

2、receiver 按引用傳遞 測試

package main

import "fmt"

type flower struct {
    Name string
}

type rose struct {
    Name string
}

func main() {

    flower := flower{Name:"a big flower"}
    rose := rose{Name:"a big rose"}
    fmt.Println("init flower:\t", flower)
    flower.show()
    fmt.Println("after flower:\t", flower)

    fmt.Println("===========================")

    fmt.Println("init rose:\t", rose)
    rose.show()
    fmt.Println("after rose:\t", rose)
}

//(flower flower)  這種方式,是按值傳遞的,不能改變原值的
func (flower flower)show()  {
    flower.Name = "I'm flower"
    fmt.Println("flower:\t", flower)
}

//(rose *rose) 是按引用傳遞的,可以改變原值的
func (rose *rose)show()  {
    rose.Name = " this is rose"
    fmt.Println("rose:\t", rose)
}

3、測試 別名 與 方法的綁定

//別名 與 方法的綁定
// 作用,就是,有一種增強(qiáng)的感覺,如int類型,本身沒有show,add方法
//別名  與   方法的組合,確有了
package main

import "fmt"

type TZ int

func main() {
    var ty TZ = 3
    fmt.Println("ty:\t" , ty)
    //Method value 調(diào)用方式,通過類型的變量來調(diào)用
    ty.show()
    ty.add()

    fmt.Println("==================Method value   Method Express的不同==============================")
    //對方法的兩種不同的導(dǎo)調(diào)用方式而已

    //Method express 調(diào)用方式,通過類型直接來調(diào)用
    //此種方式,需要自己輸入 變量
    //因?yàn)閞eceiver接收的是地址,因此,我們傳入的是地址
    (*TZ).show(&ty)
    (*TZ).add(&ty)

}

//下面的這些方法,都是通過 某一個(gè)類型的 變量 來進(jìn)行調(diào)用的
//java 是通過對象來調(diào)用的
func (tz *TZ)show()  {
    fmt.Println("---->:\t 這是int類型", *tz) //tz是地址,*tz 是取地址里的內(nèi)容了
}

func (tz *TZ)add()  {
    fmt.Println("---->:\t 這是int類型的加法")
}

4、方法訪問屬性 的權(quán)限 測試

//方法 的權(quán)限問題,是否可以訪問 私有字段呢?
//權(quán)限是以package 為級別的
//方法的訪問權(quán)限是很高的,可以訪問同一個(gè)package下的所有屬性,包括公共的,私有的
package main

import "fmt"

type bike struct {
    //小寫是私有屬性,私有屬性,只能在同一個(gè)package內(nèi),進(jìn)行訪問的
    name string
    //大寫是公共屬性
    Color string
}

func main() {
    bike := bike{name:"捷安特", Color:"黑色"}
    fmt.Println("old bike:\t", bike)

    //通過類型的變量,來調(diào)用方法
    bike.show()
    fmt.Println("new bike:\t", bike)
}

func (bike *bike)show()  {
    bike.Color = "紅色"
    bike.name = "永久" //看見了吧,方法是可以訪問同一package下的私有屬性的
    fmt.Println("bike:\t", bike)
}

5、練習(xí)題

//練習(xí)題:
//依據(jù)的理論知識:為結(jié)構(gòu)增加方法的知識
//嘗試聲明一個(gè)底層類型為int的類型
//并實(shí)現(xiàn)調(diào)用某個(gè)方法就遞增100
//如   a:=0, 調(diào)用a.Increase()只會(huì),a從0變成100
package main

import "fmt"

//為int 聲明一個(gè)別名
type intFor int

func main() {
    var a intFor = 0
    fmt.Println(a.Increase())
}

//傳的地址
//注意,返回值的類型是intFor
func (arg *intFor)Increase()  intFor {
    //添加上*,就表示取地址里的內(nèi)容了
    *arg = 100

    return *arg
}

總結(jié):

例如,type intFor int,
不光是int類型,也可以是其他類型。
開始擴(kuò)展思維,其實(shí),就是為某個(gè)類型,增加方法;
Java里的一個(gè)類里包括屬性,以及方法;
在Go語言中,各種屬性是封裝在一個(gè)類型里,方法是通過receiver來綁定;
只是不同的表現(xiàn)形式而已

創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的七星網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站標(biāo)題:Go語言之method-創(chuàng)新互聯(lián)
URL地址:http://muchs.cn/article36/ddjgsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈網(wǎng)站導(dǎo)航、靜態(tài)網(wǎng)站、網(wǎng)站建設(shè)、微信小程序App設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)