亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

Go語言struct類型詳解

2020-04-01 19:24:44
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Go語言struct類型詳解,struct是一種數據類型,可以用來定義自己想的數據類型,需要的朋友可以參考下
 

struct

Go語言中,也和C或者其他語言一樣,我們可以聲明新的類型,作為其它類型的屬性或字段的容器。例如,我們可以創建一個自定義類型person代表一個人的實體。這個實體擁有屬性:姓名和年齡。這樣的類型我們稱之struct。如下代碼所示:

 

復制代碼代碼如下:

type person struct {
    name string
    age int
}

 

看到了嗎?聲明一個struct如此簡單,上面的類型包含有兩個字段。

1.一個string類型的字段name,用來保存用戶名稱這個屬性
2.一個int類型的字段age,用來保存用戶年齡這個屬性

如何使用struct呢?請看下面的代碼:

 

復制代碼代碼如下:

type person struct {
    name string
    age int
}

 

var P person  // P現在就是person類型的變量了

P.name = "Astaxie"  // 賦值"Astaxie"給P的name屬性.
P.age = 25  // 賦值"25"給變量P的age屬性
fmt.Printf("The person's name is %s", P.name)  // 訪問P的name屬性.

 

除了上面這種P的聲明使用之外,還有另外幾種聲明使用方式:

1.按照順序提供初始化值

復制代碼代碼如下:

P := person{"Tom", 25}

2.通過field:value的方式初始化,這樣可以任意順序
復制代碼代碼如下:

P := person{age:24, name:"Tom"}

3.當然也可以通過new函數分配一個指針,此處P的類型為*person
復制代碼代碼如下:

P := new(person)

 

下面我們看一個完整的使用struct的例子

復制代碼代碼如下:

package main
import "fmt"

 

// 聲明一個新的類型
type person struct {
    name string
    age int
}

// 比較兩個人的年齡,返回年齡大的那個人,并且返回年齡差
// struct也是傳值的
func Older(p1, p2 person) (person, int) {
    if p1.age>p2.age {  // 比較p1和p2這兩個人的年齡
        return p1, p1.age-p2.age
    }
    return p2, p2.age-p1.age
}

func main() {
    var tom person

    // 賦值初始化
    tom.name, tom.age = "Tom", 18

    // 兩個字段都寫清楚的初始化
    bob := person{age:25, name:"Bob"}

    // 按照struct定義順序初始化值
    paul := person{"Paul", 43}

    tb_Older, tb_diff := Older(tom, bob)
    tp_Older, tp_diff := Older(tom, paul)
    bp_Older, bp_diff := Older(bob, paul)

    fmt.Printf("Of %s and %s, %s is older by %d years/n",
        tom.name, bob.name, tb_Older.name, tb_diff)

    fmt.Printf("Of %s and %s, %s is older by %d years/n",
        tom.name, paul.name, tp_Older.name, tp_diff)

    fmt.Printf("Of %s and %s, %s is older by %d years/n",
        bob.name, paul.name, bp_Older.name, bp_diff)
}

 

struct的匿名字段

我們上面介紹了如何定義一個struct,定義的時候是字段名與其類型一一對應,實際上Go支持只提供類型,而不寫字段名的方式,也就是匿名字段,也稱為嵌入字段。

當匿名字段是一個struct的時候,那么這個struct所擁有的全部字段都被隱式地引入了當前定義的這個struct。

讓我們來看一個例子,讓上面說的這些更具體化

復制代碼代碼如下:

package main
import "fmt"

 

type Human struct {
    name string
    age int
    weight int
}

type Student struct {
    Human  // 匿名字段,那么默認Student就包含了Human的所有字段
    speciality string
}

func main() {
    // 我們初始化一個學生
    mark := Student{Human{"Mark", 25, 120}, "Computer Science"}

    // 我們訪問相應的字段
    fmt.Println("His name is ", mark.name)
    fmt.Println("His age is ", mark.age)
    fmt.Println("His weight is ", mark.weight)
    fmt.Println("His speciality is ", mark.speciality)
    // 修改對應的備注信息
    mark.speciality = "AI"
    fmt.Println("Mark changed his speciality")
    fmt.Println("His speciality is ", mark.speciality)
    // 修改他的年齡信息
    fmt.Println("Mark become old")
    mark.age = 46
    fmt.Println("His age is", mark.age)
    // 修改他的體重信息
    fmt.Println("Mark is not an athlet anymore")
    mark.weight += 60
    fmt.Println("His weight is", mark.weight)
}

 

圖例如下:

Go語言struct類型詳解

圖2.7 Student和Human的方法繼承

我們看到Student訪問屬性age和name的時候,就像訪問自己所有用的字段一樣,對,匿名字段就是這樣,能夠實現字段的繼承。是不是很酷???還有比這個更酷的呢,那就是student還能訪問Human這個字段作為字段名。請看下面的代碼,是不是更酷了。

復制代碼代碼如下:

mark.Human = Human{"Marcus", 55, 220}
mark.Human.age -= 1

 

通過匿名訪問和修改字段相當的有用,但是不僅僅是struct字段哦,所有的內置類型和自定義類型都是可以作為匿名字段的。請看下面的例子。

 

復制代碼代碼如下:

package main
import "fmt"

 

type Skills []string

type Human struct {
    name string
    age int
    weight int
}

type Student struct {
    Human  // 匿名字段,struct
    Skills // 匿名字段,自定義的類型string slice
    int    // 內置類型作為匿名字段
    speciality string
}

func main() {
    // 初始化學生Jane
    jane := Student{Human:Human{"Jane", 35, 100}, speciality:"Biology"}
    // 現在我們來訪問相應的字段
    fmt.Println("Her name is ", jane.name)
    fmt.Println("Her age is ", jane.age)
    fmt.Println("Her weight is ", jane.weight)
    fmt.Println("Her speciality is ", jane.speciality)
    // 我們來修改他的skill技能字段
    jane.Skills = []string{"anatomy"}
    fmt.Println("Her skills are ", jane.Skills)
    fmt.Println("She acquired two new ones ")
    jane.Skills = append(jane.Skills, "physics", "golang")
    fmt.Println("Her skills now are ", jane.Skills)
    // 修改匿名內置類型字段
    jane.int = 3
    fmt.Println("Her preferred number is", jane.int)
}

 

從上面例子我們看出來struct不僅僅能夠將struct作為匿名字段、自定義類型、內置類型都可以作為匿名字段,而且可以在相應的字段上面進行函數操作(如例子中的append)。

這里有一個問題:如果human里面有一個字段叫做phone,而student也有一個字段叫做phone,那么該怎么辦呢?

Go里面很簡單的解決了這個問題,最外層的優先訪問,也就是當你通過student.phone訪問的時候,是訪問student里面的字段,而不是human里面的字段。

這樣就允許我們去重載通過匿名字段繼承的一些字段,當然如果我們想訪問重載后對應匿名類型里面的字段,可以通過匿名字段名來訪問。請看下面的例子。

 

復制代碼代碼如下:

package main
import "fmt"

 

type Human struct {
    name string
    age int
    phone string  // Human類型擁有的字段
}

type Employee struct {
    Human  // 匿名字段Human
    speciality string
    phone string  // 雇員的phone字段
}

func main() {
    Bob := Employee{Human{"Bob", 34, "777-444-XXXX"}, "Designer", "333-222"}
    fmt.Println("Bob's work phone is:", Bob.phone)
    // 如果我們要訪問Human的phone字段
    fmt.Println("Bob's personal phone is:", Bob.Human.phone)
}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲天堂免费视频| 亚洲美女黄色片| 亚洲已满18点击进入在线看片| 精品久久久久久久大神国产| 韩日精品中文字幕| 亚洲综合在线做性| 国产91精品不卡视频| 国产这里只有精品| 91精品久久久久久久久久| 91地址最新发布| 亚洲美女av网站| 国产日本欧美在线观看| 亚洲精品网站在线播放gif| 欧美另类极品videosbestfree| 精品国产视频在线| 九色91av视频| 日韩欧美成人区| 欧美成年人网站| 日韩电影在线观看免费| 亚洲va欧美va国产综合久久| 国产精品自产拍在线观| 国产精品视频网| 一区二区亚洲精品国产| 欧美精品久久久久久久免费观看| 欧美性xxxx极品hd欧美风情| 国产亚洲精品久久久| 国产视频在线一区二区| 国产精品免费看久久久香蕉| 中文字幕亚洲欧美日韩在线不卡| 97在线视频免费观看| 7m第一福利500精品视频| 欧美放荡办公室videos4k| 成人激情在线观看| 欧美精品一区在线播放| 亚洲裸体xxxx| 亚洲xxxx妇黄裸体| 亚洲国产精品视频在线观看| 91精品美女在线| 91欧美视频网站| 韩国精品美女www爽爽爽视频| 久久久久免费视频| 91国产中文字幕| 日韩成人网免费视频| 国产精品久久久久999| 欧美激情一二区| 日韩亚洲国产中文字幕| 国产精品日本精品| 在线观看91久久久久久| 日韩综合视频在线观看| 欧美一级视频在线观看| 久久亚洲精品视频| 久久视频在线直播| 亚洲国产精品中文| 久久6免费高清热精品| 色哟哟亚洲精品一区二区| www.亚洲一二| 国产精品亚洲一区二区三区| 久久精品国产91精品亚洲| 国产精品三级美女白浆呻吟| 蜜臀久久99精品久久久无需会员| 久久久国产精品视频| 亚洲美女喷白浆| 国产精品久久久久av| 国产精品成人播放| 色999日韩欧美国产| 欧美一区二区三区艳史| 国产人妖伪娘一区91| 国产精品久久久久久久久久三级| 中文字幕在线观看亚洲| 成人免费自拍视频| 中文字幕精品av| 97成人超碰免| 自拍偷拍亚洲欧美| 91日本在线视频| 成人免费视频在线观看超级碰| 91美女片黄在线观| 最近2019免费中文字幕视频三| 午夜精品久久久久久久白皮肤| 久久久亚洲精选| 亚洲天堂免费在线| 欧美在线观看www| 日本一区二区三区四区视频| 欧洲精品在线视频| 欧美最猛黑人xxxx黑人猛叫黄| 欧美性在线观看| 国产一区二区丝袜高跟鞋图片| 日本国产一区二区三区| 4438全国亚洲精品在线观看视频| 日韩精品免费综合视频在线播放| 欧美成人激情在线| 国产啪精品视频| 精品无人区乱码1区2区3区在线| 亚洲免费视频一区二区| 中文字幕视频一区二区在线有码| 日韩亚洲第一页| 69av在线播放| 亚洲成人中文字幕| 亚洲国产婷婷香蕉久久久久久| 久久综合久久八八| 热久久这里只有| 久久久91精品国产| 久久韩国免费视频| 亚洲最新中文字幕| 国产精品视频自拍| 中国china体内裑精亚洲片| 国产性猛交xxxx免费看久久| 日韩欧中文字幕| 久久国产精品偷| 亚洲国产精品资源| 日韩精品一二三四区| 中文字幕一区二区三区电影| 欧美疯狂xxxx大交乱88av| 国产精品美腿一区在线看| 91成人在线视频| 亚洲bt欧美bt日本bt| 国产亚洲精品激情久久| 日韩精品中文字幕久久臀| 欧美日韩免费网站| 精品亚洲精品福利线在观看| 国产精品爽爽爽| 最近中文字幕mv在线一区二区三区四区| 国产亚洲精品激情久久| 伊人伊成久久人综合网小说| 色噜噜国产精品视频一区二区| 亚洲欧美激情另类校园| 欧美久久精品午夜青青大伊人| 国产91精品久久久久久久| 日韩精品极品在线观看播放免费视频| 精品人伦一区二区三区蜜桃网站| 91爱爱小视频k| 欧美日本啪啪无遮挡网站| 欧美裸身视频免费观看| 欧美多人乱p欧美4p久久| 亚洲成av人影院在线观看| 国产精品一区二区电影| 欧美成人免费全部观看天天性色| 国产精品白嫩初高中害羞小美女| 日韩视频免费在线观看| 亚洲成人av片| 日韩一区二区三区国产| 欧美激情精品在线| 亚洲人成在线电影| 日韩av中文在线| 伦伦影院午夜日韩欧美限制| 亚洲韩国青草视频| 国产精品福利无圣光在线一区| 成人h片在线播放免费网站| 粉嫩老牛aⅴ一区二区三区| 亚洲成人中文字幕| 国产91久久婷婷一区二区| 91精品国产91久久久久久久久| 亚洲国产精品久久久| 国产91久久婷婷一区二区| 成人激情av在线| 欧美视频在线看| 日韩av片电影专区| 国产精品视频公开费视频| 欧美在线视频免费播放| 欧美精品生活片| 国产精品第一区| www日韩欧美| 欧美日韩成人在线视频| 亚洲大胆人体在线| 在线国产精品视频|