Go 語言學(xué)習(xí)之struct

學(xué)海無涯苦作舟懦胞,書山有路勤為徑

寫在最前

最近出差剛回來瘟仿,想想在北京的日子真的是慘不忍睹,太熱了....而且對于我這個從小吃辣長大的川漢子來說研铆,簡直是折磨埋同。扯點閑談,現(xiàn)在進入正題吧蚜印。struct又稱為機構(gòu)體,在c語言或者是objective-c留量、java等其他語言中應(yīng)該是都有的窄赋,可以作為一個容器哟冬,裝入一些其他類型。在這之前忆绰,我也去重新復(fù)習(xí)了下cobjective-c中的結(jié)構(gòu)體浩峡。

struct回顧

下面就舉例說明下

幾種定義方式及其使用

//test1為結(jié)構(gòu)名 而 后面的test1Rename為結(jié)構(gòu)變量
typedef struct test1{
    CGFloat a;
    CGFloat b;
}test1Rename;

struct test2{
    CGFloat c;
    CGFloat d;
};
typedef struct test2 test2Rename;


typedef struct {
    CGFloat a;
    CGFloat b;
}test3Rename;


struct test4{
    CGFloat a;
    CGFloat b;
};

struct{
    CGFloat a;
    CGFloat b;
}test5Rename;

struct test6{
    CGFloat a;
    CGFloat b;
}test6Rename;

//typedef 的作用是為一種數(shù)據(jù)類型定義一個新名字

//使用

    test1Rename test1rename = {9,9};
    struct test1 test1 = {10,11};
    
    test2Rename test2rename = {11,12};
    struct test2 test2 = {21,22};
    
    test3Rename test3rename = {1,2};
    
    
    struct test4 test4 = {22,33};
    
    
    
    test5Rename.a = 10;
    test5Rename.b = 19;
    
    test6Rename.a = 11;
    test6Rename.b = 12;
    
    struct test6 test6 ={12,23};

上面定義了六種方式的結(jié)構(gòu)體,其中前三種為帶typedef關(guān)鍵字错敢,后面不帶翰灾,那么這個關(guān)鍵字又是什么意思呢?其大意就是為一種數(shù)據(jù)類型定義一個新名字稚茅,下面我們就根據(jù)例子的使用情況來講解下纸淮。

  • 1和2 兩種都是帶了typedef且定義的時候有結(jié)構(gòu)名和結(jié)構(gòu)變量名

    在使用結(jié)構(gòu)體的時候,我們可以有兩種不同的方式亚享,分別通過結(jié)構(gòu)名來創(chuàng)建新的變量和通過結(jié)構(gòu)變量來創(chuàng)建

    唯一的區(qū)別在于 咽块,通過結(jié)構(gòu)名來創(chuàng)建,需要在前面加上struct 欺税,而通過結(jié)構(gòu)變量來創(chuàng)建則少了struct

      test1Rename test1rename = {9,9};
      struct test1 test1 = {10,11};
        
      test2Rename test2rename = {11,12};
      struct test2 test2 = {21,22};
    
  • 3沒有定義結(jié)構(gòu)名侈沪,而是直接通過typedef來創(chuàng)建了一個結(jié)構(gòu)變量,在使用的時候晚凿,同1和2中的通過結(jié)構(gòu)變量來使用是一樣的

  • 4亭罪、5、6均沒有使用typedef歼秽,4沒有定義結(jié)構(gòu)變量应役,所以在使用的時候必須加上struct

    struct test4 test4 = {22,33};
    

    5沒有定義結(jié)構(gòu)名,卻定義的有結(jié)構(gòu)變量哲银,但是這里我們不同通過結(jié)構(gòu)變量來創(chuàng)建結(jié)構(gòu)體扛吞,只能直接使用該結(jié)構(gòu)體變量,因為沒有通過typedef來定義

     test5Rename.a = 10;
     test5Rename.b = 19;
     
     //test5Rename test5rename = {1,2}; 錯誤
    

    6則既定義了結(jié)構(gòu)名也定義了結(jié)構(gòu)變量荆责,其中的結(jié)構(gòu)變量可以直接使用滥比,結(jié)構(gòu)名可以用來創(chuàng)建新的結(jié)構(gòu)變量

    test6Rename.a = 11;
    test6Rename.b = 12;
        
    struct test6 test6 ={12,23};
    

    ?

到這里,我們就差不多對結(jié)構(gòu)體有了大概的了解做院,對typedef的作用也大概有了了解盲泛,下面就進入今天的主題,在go中的struct

struct

go中键耕,其定義為

type structName struct {
    var1 string
    var2 int
}

可以看出寺滚,在go中聲明一個struct還是挺簡單的,那么怎么使用呢屈雄?看下面代碼

//定義一個Anima 結(jié)構(gòu)體
type Anima struct {
    Name string
    Age int
}

//使用方式
    anima1 := hellotest.Anima{}
    anima1.Age = 12
    anima1.Name = "大象"
    fmt.Println(anima1.Age,anima1.Name)

    anima2 := hellotest.Anima{"河馬",14}
    fmt.Println(anima2.Name,anima2.Age)

    anima3 := hellotest.Anima{Age:9,Name:"豹子"}
    fmt.Println(anima3.Age,anima3.Name)

    var  anima4 hellotest.Anima 
    anima4.Age = 14
    anima4.Name = "獅子"

在上面的使用方式中村视,有一種需要特別注意,那就是anima2 := hellotest.Anima{"河馬",14}這種方式酒奶,必須按照順序提供初始化值蚁孔,及按照我們定義的結(jié)構(gòu)體中的屬性的順序來賦值

注:由于上面奶赔,我是在package hellotest中定義的結(jié)構(gòu)體,所以在main package中使用的時候杠氢,加了hellotest.的方式來調(diào)用站刑,這中需要注意的是,結(jié)構(gòu)體如果要被其他的包引用鼻百,那么結(jié)構(gòu)體的首字母必須大寫绞旅,而且里面屬性如果需要被用到,也必須大寫温艇。

struct匿名字段

go語言中因悲,定義struct的時候,除了類型和字段名一一對應(yīng)中贝,也可以支持不寫字段名囤捻,而只寫類型,也就是匿名字段邻寿。

下面看看例子

//匿名字段
type Cat struct {
    int
    string
}

func CatInfo()  {
    cat := Cat{12,"小花"}
    fmt.Println(cat.string,cat.int);
}

//調(diào)用CatInfo方法
hellotest.CatInfo()
//輸出結(jié)果   
小花 12

上面的例子中匿名字段的類型蝎土,都是一些基本類型,如果換成是struct又會怎么樣呢绣否?我們就已剛剛那個Cat為例子誊涯,在其中加入Anima

//匿名字段
type Cat struct {
    Anima
    int
    string
}

func CatInfo()  {
    cat := Cat{Anima{"動物類型",4},12,"小花"}
    fmt.Println(cat.Age,cat.Name,cat.string,cat.int);
    cat.Age = 5;
    cat.Name = "動物類型-溫順動物"
    fmt.Println(cat.Age,cat.Name,cat.string,cat.int);
    cat.Anima.Age = 6;
    cat.Anima.Name = "動物類型-溫順動物-貓科"
    fmt.Println(cat.Age,cat.Name,cat.string,cat.int);
    cat.Anima = Anima{"動物類型-溫順動物-貓科-白貓",7}
    fmt.Println(cat.Age,cat.Name,cat.string,cat.int);
}
//輸出結(jié)果為
4 動物類型 小花 12
5 動物類型-溫順動物 小花 12
6 動物類型-溫順動物-貓科 小花 12
7 動物類型-溫順動物-貓科-白貓 小花 12

通過上面的例子 我們可以看到,當(dāng)匿名字段是struct的時候蒜撮,struct的全部字段都被隱式的加入了當(dāng)前的結(jié)構(gòu)體中暴构,我們不僅可以直接通過當(dāng)前的結(jié)構(gòu)體來調(diào)用,也可以訪問匿名字段類型作為字段名段磨,而且可以在相應(yīng)的字段上面進行函數(shù)操作取逾,如上面的

cat.Anima.Age = 6;
cat.Anima.Name = "動物類型-溫順動物-貓科"
fmt.Println(cat.Age,cat.Name,cat.string,cat.int);

cat.Anima = Anima{"動物類型-溫順動物-貓科-白貓",7}
fmt.Println(cat.Age,cat.Name,cat.string,cat.int);

但是值得注意的是,初始化的時候苹支,必須通過匿名的struct來砾隅,但是后面改變值的時候,可以直接修改债蜜,如下面的方式是不可行的

cat1 := Cat{"動物類型",4,12,"小花"}
fmt.Println(cat.Age,cat.Name,cat.string,cat.int);

最后還有一個問題晴埂,那就是如果我們的匿名struct中有個字段和我們的當(dāng)前struct中都有相同的字段,那該怎么辦呢寻定?

go語言中儒洛,所采取的方式是優(yōu)先采用最外層的屬性,并且里層的需要訪問狼速,就必須通過匿名字段作為字段名來訪問琅锻。看下面例子

type Anima struct {
    Name string
    Age int
}

type Dog struct {
    Anima
    Sex string
    Name string
}

func DogInfo()  {
    dog := Dog{Anima{"動物類型",8},"公的","動物類型-兇猛動物-狗"}
    fmt.Println(dog.Anima.Name,dog.Age,dog.Name,dog.Sex)

    dog.Name = "動物類型-兇猛動物-狗-小白狗"
    fmt.Println(dog.Anima.Name,dog.Name)
}
//輸出結(jié)果
動物類型 8 動物類型-兇猛動物-狗 公的
動物類型 動物類型-兇猛動物-狗-小白狗

從上面的例子中,可以看出恼蓬,訪問順序的優(yōu)先級

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沫浆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滚秩,更是在濱河造成了極大的恐慌,老刑警劉巖淮捆,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郁油,死亡現(xiàn)場離奇詭異,居然都是意外死亡攀痊,警方通過查閱死者的電腦和手機桐腌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苟径,“玉大人案站,你說我怎么就攤上這事〖郑” “怎么了蟆盐?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遭殉。 經(jīng)常有香客問我石挂,道長,這世上最難降的妖魔是什么险污? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任痹愚,我火速辦了婚禮,結(jié)果婚禮上蛔糯,老公的妹妹穿的比我還像新娘拯腮。我一直安慰自己,他們只是感情好蚁飒,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布动壤。 她就那樣靜靜地躺著,像睡著了一般飒箭。 火紅的嫁衣襯著肌膚如雪狼电。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天弦蹂,我揣著相機與錄音肩碟,去河邊找鬼。 笑死凸椿,一個胖子當(dāng)著我的面吹牛削祈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼髓抑,長吁一口氣:“原來是場噩夢啊……” “哼咙崎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吨拍,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤褪猛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后羹饰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伊滋,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年队秩,在試婚紗的時候發(fā)現(xiàn)自己被綠了笑旺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡馍资,死狀恐怖筒主,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鸟蟹,我是刑警寧澤乌妙,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站建钥,受9級特大地震影響冠胯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锦针,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一荠察、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奈搜,春花似錦悉盆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宏粤,卻和暖如春脚翘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绍哎。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工来农, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崇堰。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓沃于,卻偏偏與公主長得像涩咖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子繁莹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

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

  • Block基礎(chǔ)回顧 1.什么是Block檩互? 帶有局部變量的匿名函數(shù)(名字不重要,知道怎么用就行)咨演,差不多就與C語言...
    Bugfix閱讀 6,771評論 5 61
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理闸昨,服務(wù)發(fā)現(xiàn),斷路器薄风,智...
    卡卡羅2017閱讀 134,715評論 18 139
  • 2014年的蘋果全球開發(fā)者大會(WWDC)零院,當(dāng)Craig Federighi向全世界宣布“We have new ...
    yeshenlong520閱讀 2,295評論 0 9
  • Blocks Blocks Blocks 是帶有局部變量的匿名函數(shù) 截取自動變量值 int main(){ ...
    南京小伙閱讀 934評論 1 3
  • 作為一個被稱贊”文筆好“的文科生,作為一個也寫出過中篇村刨、短篇和工作文集的“偽文青”,最近卻常常有“詞窮”的感覺撰茎。寫...
    燕語叮嚀閱讀 668評論 11 9