Go 語言之 struct 結構體

來源:互聯網
上載者:User

標籤:go   struct   

struct 結構
  • Go中的struct與C語言中的struct非常相似,並且Go沒有class
  • 使用type<Name> struct{} 定義結構,名稱遵循可見度規則
  • 支援指向自身的指標類型成員
  • 支援匿名結構,可用作成員或定義成員變數
  • 匿名結構也可以用於map的值
  • 可以使用字面值對結構進行初始化
  • 允許直接通過指標來讀寫結構成員
  • 相同類型的成員可以進行直接拷貝賦值
  • 支援== 與 != 比較子,但不支援 > 或 <
  • 支援匿名欄位,本質上是定義了以某個類型名為名稱的欄位
  • 嵌入結構作為匿名欄位看起來像繼承,但不是繼承
  • 可以使用匿名欄位指標
測試案例
//package mainimport "fmt"//定義了一 個空的結構體type st01 struct {}//定義一個非空的結構體type person struct {    Name string    Age  int}func main() {    personInfo := person{}    personInfo.Age = 19    personInfo.Name = "xiaoqiang"    fmt.Println(personInfo)    //------------------------------    fmt.Println("=============================")    //直接初始化   屬於 字面值 初始化    personInfo2 := person{Name :"spark01", Age: 19}    fmt.Println(personInfo2)}
結構體,按值傳遞

//結構體,按值 傳遞package mainimport "fmt"//定義一個類型type sparkInfo struct {    SparkClusterName string    SparkNodeNum     int}func main() {    newSparkInfo := sparkInfo{        SparkNodeNum:     8,        SparkClusterName: "spark-test-001"}    fmt.Println("main:\t", newSparkInfo)    updateSparkInfo(newSparkInfo)    fmt.Println("main:\t", newSparkInfo)}//同樣,這裡是值傳遞,內部的修改,並不會影響到 舊值的func updateSparkInfo(sparkInfo sparkInfo) {    sparkInfo.SparkNodeNum = 9    fmt.Println("updateSparkInfo:\t", sparkInfo)}
結構體,按地址傳遞

//結構體,按地址傳遞package mainimport "fmt"type k8sInfo struct {    K8sClusterName string //k8s叢集的名稱    K8sClusterNumm int    //k8s叢集的節點個數}func main() {    k8sInfo := k8sInfo{        K8sClusterNumm: 1,        K8sClusterName: "k8s-test-001"}    fmt.Println(k8sInfo)    updateK8sClusterInfo(&k8sInfo)    fmt.Println(k8sInfo)}//傳遞的是 地址,按地址傳遞//修改了,舊的值func updateK8sClusterInfo(info *k8sInfo) {    info.K8sClusterNumm = 110    fmt.Println("updateK8s:\t", info)}
結構體,按地址傳遞

//結構體,按地址傳遞package mainimport "fmt"type dockerInfo struct {    DockerClusterName string    DockerClusterNum int}func main() {    //一般更習慣這種寫法,    //在初始化的時候,就直接擷取地址    //這樣以後在調用的時候,就不需要添加&號了    dInfo := &dockerInfo{        DockerClusterNum:19,        DockerClusterName:"docker-yizhuang"}    fmt.Println("init docker:\t", dInfo)    updateDockerInfo(dInfo)    fmt.Println("after docker:\t", *dInfo)}func updateDockerInfo (info *dockerInfo) {    info.DockerClusterNum = 80    fmt.Println("udpateDocker:\t", info)}
匿名結構

//匿名結構package mainimport "fmt"func main() {    //建立一個匿名結構,    //並且進行了初始化    //而且,直接擷取地址&    ftp := &struct {        FtpName string        FtpNum int    }{        FtpName:"ftp-beijing",        FtpNum:8}    fmt.Println(ftp)    fmt.Println(*ftp)    fmt.Println("FtpName:\t", ftp.FtpName)    fmt.Println("FtpNum:\t", ftp.FtpNum)}
匿名結構, 嵌套進別的結構體裡

//將匿名結構,嵌套進別的結構體裡package mainimport "fmt"type hadoop struct {    HadoopClusterName string    HadoopClusterNum  int    //建立一個匿名結構    HadoopOtherInfo struct {        //同樣,當多個變數都一樣的時候,也可用省略        //這是Go語言的優點        HadoopVersion, HadoopUrl string    }}func main() {    hdfs := &hadoop{        HadoopClusterName: "Hadoop-test-001",        HadoopClusterNum:  9}    //只能通過這種方式,進行初始化    hdfs.HadoopOtherInfo.HadoopUrl = "http://192.168.1.110:50070"    hdfs.HadoopOtherInfo.HadoopVersion = "v2.7.0"    fmt.Println(hdfs)    fmt.Println(*hdfs)    fmt.Println("HadoopClusterName:\t", hdfs.HadoopClusterName)    fmt.Println("HadoopClusterNum:\t", hdfs.HadoopClusterNum)    fmt.Println("HadoopClusterVersion:\t", hdfs.HadoopOtherInfo.HadoopVersion)    fmt.Println("HadoopClusterUrl:\t", hdfs.HadoopOtherInfo.HadoopUrl)}
匿名欄位

//匿名欄位  測試package mainimport "fmt"type students struct {    //這些就是匿名欄位,沒有定義名字    string    int}func main() {    boy := &students{        //初始化的時候,必須按照順序來進行的        "xiaoqiang", 19}    fmt.Println(boy)}
相同結構體 之間 操作,如賦值,比較

// 相同結構體  之間 操作,如賦值,比較package mainimport "fmt"type teacherA struct {    string    int} type teacherB struct {    string    int }func main() {    boyTeacherA := teacherA{"xiaoli",22}    //boyTeacherB := teacherB{"xiaoli",22}    //説明:編譯報錯了,teacherA, teacherB  類型不相同,不能進行比較的    //fmt.Println(boyTeacherA == boyTeacherB)    boyTeacherB := teacherA{"xiaoli", 23}    fmt.Println(boyTeacherB == boyTeacherA)}
結構體,實現 類似於 繼承的效果

//結構體,實現 類似於 繼承的效果package mainimport "fmt"type anminal struct {    //設定一些共有的屬性    Name, address string}type cat struct {    //anminal  Go 語言,預設,anminal是類型,同時也是屬性名稱    anminal    Sex int         // 貓的特有屬性,性別是啥}type dog struct {    anminal    Hobby string  //狗的特有屬性,愛好}func main() {    //第一種初始化方式    xiaoCat := cat{Sex:0, anminal : anminal{Name:"xiaohong", address:"beijing"}}    xiaoDog := dog{Hobby:"play", anminal:anminal{Name:"xiaohuang", address:"shanghai"}}    //第二種初始化方式    xiaoCat.anminal.Name = "xiaoxiaoxiaohong" //這種方式,是為了防止名字相同時,衝突    xiaoCat.Name = "xiaoxiaohong"    fmt.Println("cat:\t", xiaoCat)    fmt.Println("dog:\t",xiaoDog)}

Go 語言之 struct 結構體

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.