golang結(jié)構(gòu)體-對(duì)象和指針-函數(shù)賦予-創(chuàng)新互聯(lián)

1、定義一個(gè)結(jié)構(gòu)體

創(chuàng)新互聯(lián)公司客戶idc服務(wù)中心,提供成都服務(wù)器托管、成都服務(wù)器、成都主機(jī)托管、成都雙線服務(wù)器等業(yè)務(wù)的一站式服務(wù)。通過各地的服務(wù)中心,我們向成都用戶提供優(yōu)質(zhì)廉價(jià)的產(chǎn)品以及開放、透明、穩(wěn)定、高性價(jià)比的服務(wù),資深網(wǎng)絡(luò)工程師在機(jī)房提供7*24小時(shí)標(biāo)準(zhǔn)級(jí)技術(shù)保障。
type User struct {
    userid   int
    username string
    password string}

2、初始化一個(gè)結(jié)構(gòu)體

有兩種情況,一是得到結(jié)構(gòu)體的對(duì)象,一是得到結(jié)構(gòu)的對(duì)象指針,分別有三種方式:

golang結(jié)構(gòu)體-對(duì)象和指針-函數(shù)賦予

 //第1種方式,先聲明對(duì)象,再初始化
    var player1 Player
    player1.userid = 1
    player1.username = "lina1"
    player1.password = "123456"
  
    //第2種方式,聲明同時(shí)初始化
    player2 := Player{2, "lina2", "123456"}

    //第3種方式,通過 field:value 形式初始化,該方式可以靈活初始化字段的順序
    player3 := Player{username: "lina3", password: "123456", userid: 3}

    //上面三種初始化方式都是生產(chǎn)對(duì)象的,相應(yīng)如果想初始化得到對(duì)象指針的三種方法如下:
    //第1種方式,使用 new 關(guān)鍵字
    player4 := new(Player)
    player4.userid = 4
    player4.username = "lina4"
    player4.password = "123456"

    //第2種方式,聲明同時(shí)初始化
    player5 := &Player{5, "lina2", "123456"}

    //第3種方式,通過 field:value 形式初始化,該方式可以靈活初始化字段的順序
    player6 := &Player{username: "lina3", password: "123456", userid: 6}

golang結(jié)構(gòu)體-對(duì)象和指針-函數(shù)賦予

3、對(duì)象與對(duì)象指針的區(qū)別(更確切的說應(yīng)該是值類型和指針類型)

與C/C++類似,GO語言也存在對(duì)象與對(duì)象的指針,但不同的是,GO語言中沒有 -> 操作符來調(diào)用指針?biāo)鶎俚某蓡T,而與一般對(duì)象一樣,都是使用 . 來調(diào)用。

對(duì)于一個(gè)函數(shù)(或方法),如果函數(shù)的參數(shù)(或接收者)是對(duì)象指針時(shí),表示此對(duì)象是可被修改的;相反的,如果是對(duì)象時(shí),表示是不可修改的(但如果該對(duì)象本身就是引用類型,如 map\func\chan 等,則本質(zhì)上是可以修改的)。所以一般的做法是,方法的接收者習(xí)慣性使用對(duì)象指針,而不是對(duì)象,一方面可以在想修改對(duì)象時(shí)進(jìn)行修改,另一方面也減少參數(shù)傳遞的拷貝成本。

另外,有一點(diǎn)尤為特殊,如果是作為函數(shù)的參數(shù),則函數(shù)定義時(shí),是使用對(duì)象還是對(duì)象指針,是有本質(zhì)區(qū)別的,在使用對(duì)象作為參數(shù)的函數(shù)中,不能傳入對(duì)象指針,同樣的,在使用對(duì)象指針作為參數(shù)的函數(shù)中,也不能傳入對(duì)象,否則編譯器會(huì)報(bào)錯(cuò)。但如果是方法,則接收者定義為對(duì)象還是對(duì)象指針,都可以接收對(duì)象和對(duì)象指針的調(diào)用。下面我們來定義相關(guān)的函數(shù)和方法如下:

golang結(jié)構(gòu)體-對(duì)象和指針-函數(shù)賦予

//傳入 Player 對(duì)象參數(shù)func print_obj(player Player) {
    //player.username = "new"  //修改并不會(huì)影響傳入的對(duì)象本身
    log.Println("userid:", player.userid)
}//傳入 Player 對(duì)象指針參數(shù)func print_ptr(player *Player) {
    player.username = "new"
    log.Println("userid:", player.userid)
}//接收者為 Player 對(duì)象的方法,方法接收者的變量,按照 GO 語言的習(xí)慣一般不用 this/self ,而是使用接收者類型的第一個(gè)小寫字母,可以看標(biāo)準(zhǔn)庫中的代碼風(fēng)格。func (p Player) m_print_obj() {
    //p.username = "new"  //修改并不會(huì)影響傳入的對(duì)象本身
   log.Println("self userid:", p.userid) 
} 

//接收者為 Player 對(duì)象指針的方法func (p *Player) m_print_ptr() { 
  p.username = "new"   log.Println("self userid:", p.userid) 
}

golang結(jié)構(gòu)體-對(duì)象和指針-函數(shù)賦予

   然后測(cè)試一下函數(shù)跟方法的調(diào)用:

golang結(jié)構(gòu)體-對(duì)象和指針-函數(shù)賦予

    print_obj(player2)
    //print_ptr(player2)        //無法調(diào)用,編譯出錯(cuò)    player2.m_print_obj()
    player2.m_print_ptr()

    //print_obj(player6)        //無法調(diào)用,編譯出錯(cuò)
    print_ptr(player6) 
    player6.m_print_obj()
    player6.m_print_ptr()

golang結(jié)構(gòu)體-對(duì)象和指針-函數(shù)賦予

   既然對(duì)于對(duì)象與對(duì)象指針的區(qū)別,方法的處理很特殊,那么將一個(gè)對(duì)象傳入到接收者為對(duì)象指針的方法中,及將一個(gè)對(duì)象指針傳入到一個(gè)接收者為對(duì)象的方法中,能不能修改傳入對(duì)象的值呢?答案是,由方法的定義決定,而不是方法的調(diào)用者類型決定。

4、匿名字段

結(jié)構(gòu)體里的字段可以只有類型名,而沒有字段名,這種字段稱為匿名字段。匿名字段可以是一個(gè)結(jié)構(gòu)體、切片等復(fù)合類型,也可以是 int 這樣的簡(jiǎn)單類型。但建議不要把簡(jiǎn)單類型作為匿名字段。

golang結(jié)構(gòu)體-對(duì)象和指針-函數(shù)賦予

type Pet struct {
    id      int
    petname string}

type Player struct {
    id int
    Pet
    int}

func main() {
    var player1 Player
    player1.petname = "pet1" //可以直接訪問匿名字段中的成員,就像訪問自己的成員一樣
    player1.int = 3          //一般不推薦將簡(jiǎn)單類型作為匿名字段,如果有多個(gè)匿名的int,這里就沒法處理了
    player1.id = 1           //如果外層跟內(nèi)層字段名重復(fù)的話,優(yōu)先取外層字段
    player1.Pet.id = 10      //如果外層跟內(nèi)層字段名重復(fù)的話,可以通過這種形式來訪問內(nèi)層字段}

golang結(jié)構(gòu)體-對(duì)象和指針-函數(shù)賦予

一個(gè)命名為S的結(jié)構(gòu)體類型將不能再包含S類型的成員:因?yàn)橐粋€(gè)聚合的值不能包含它自身。(該限制同樣適應(yīng)于數(shù)組。)但是S類型的結(jié)構(gòu)體可以包含*S指針類型的成員,這可以讓我們創(chuàng)建遞歸的數(shù)據(jù)結(jié)構(gòu),比如鏈表和樹結(jié)構(gòu)等。

如果結(jié)構(gòu)體沒有任何成員的話就是空結(jié)構(gòu)體,寫作struct{}。它的大小為0,也不包含任何信息,但是有時(shí)候依然是有價(jià)值的。有些Go語言程序員用map帶模擬set數(shù)據(jù)結(jié)構(gòu)時(shí),用它來代替map中布爾類型的value,只是強(qiáng)調(diào)key的重要性,但是因?yàn)楣?jié)約的空間有限,而且語法比較復(fù)雜,所有我們通常避免避免這樣的用法。

seen := make(map[string]struct{}) // set of strings// ...if _, ok := seen[s]; !ok {
   seen[s] = struct{}{}
   // ...first time seeing s...
}

結(jié)構(gòu)體可以作為函數(shù)的參數(shù)和返回值,如果結(jié)構(gòu)體較大,一般使用指針參數(shù),而且如果要在函數(shù)修改結(jié)構(gòu)體,則必須使用指針形式。go語言中所有的函數(shù)參數(shù)都是值拷貝。

如果結(jié)構(gòu)體的全部成員都是可比較的,則該結(jié)構(gòu)體也可比較,則可作為Map的key類型。

得意于匿名嵌入的特性,我們可以直接訪問葉子屬性而不需要給出完整的路徑:


var w Wheel
w.X = 8            // equivalent to w.Circle.Point.X = 8
w.Y = 8            // equivalent to w.Circle.Point.Y = 8
w.Radius = 5       // equivalent to w.Circle.Radius = 5
w.Spokes = 20
 

不幸的是,結(jié)構(gòu)體字面值并沒有簡(jiǎn)短表示匿名成員的語法, 因此下面的語句都不能編譯通過:


w = Wheel{8, 8, 5, 20}                       // compile error: unknown fields
w = Wheel{X: 8, Y: 8, Radius: 5, Spokes: 20} // compile error: unknown fields


到目前為止,我們看到匿名成員特性只是對(duì)訪問嵌套成員的點(diǎn)運(yùn)算符提供了簡(jiǎn)短的語法糖。稍后,我們將會(huì)看到匿名成員并不要求是結(jié)構(gòu)體類型;其實(shí)任何命令的類型都可以作為結(jié)構(gòu)體的匿名成員。但是為什么要嵌入一個(gè)沒有任何子成員類型的匿名成員類型呢?

答案是匿名類型的方法集。簡(jiǎn)短的點(diǎn)運(yùn)算符語法可以用于選擇匿名成員嵌套的成員,也可以用于訪問它們的方法。實(shí)際上,外層的結(jié)構(gòu)體不僅僅是獲得了匿名成員類型的所有成員,而且也獲得了該類型導(dǎo)出的全部的方法。這個(gè)機(jī)制可以用于將一個(gè)有簡(jiǎn)單行為的對(duì)象組合成有復(fù)雜行為的對(duì)象。組合是Go語言中面向?qū)ο缶幊痰暮诵?/p>

結(jié)體體定義時(shí),可以為每一個(gè)字段添加一個(gè) Tag,比如使用內(nèi)置Json庫時(shí),就可能用到這個(gè)Tag。具體看元數(shù)據(jù)和反射。

另外有需要云服務(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)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

新聞名稱:golang結(jié)構(gòu)體-對(duì)象和指針-函數(shù)賦予-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://bm7419.com/article48/gishp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站響應(yīng)式網(wǎng)站、品牌網(wǎng)站建設(shè)商城網(wǎng)站、Google、定制網(wǎng)站

廣告

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

h5響應(yīng)式網(wǎng)站建設(shè)