手记

Go 语言之 struct 结构体


struct 结构

Go中的struct与C语言中的struct非常相似,并且Go没有class

使用type<Name> struct{} 定义结构,名称遵循可见性规则

支持指向自身的指针类型成员

支持匿名结构,可用作成员或定义成员变量

匿名结构也可以用于map的值

可以使用字面值对结构进行初始化

允许直接通过指针来读写结构成员

相同类型的成员可以进行直接拷贝赋值

支持== 与 != 比较运算符,但不支持 > 或 <

支持匿名字段,本质上是定义了以某个类型名为名称的字段

嵌入结构作为匿名字段看起来像继承,但不是继承

可以使用匿名字段指针

测试用例

//

package main

import "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 main

import "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 main

import "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 main

import "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 main

import "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 main

import "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 main

import "fmt"

type students struct {

    //这些就是匿名字段,没有定义名字

    string

    int

}

func main() {

    boy := &students{

        //初始化的时候,必须按照顺序来进行的

        "xiaoqiang", 19}

    fmt.Println(boy)

}

相同结构体 之间 操作,如赋值,比较

// 相同结构体  之间 操作,如赋值,比较

package main

import "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 main

import "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)

}

struct里含有匿名函数

package main

import "fmt"

type annimal2 struct {

    name string

    // 这种形式,也是可以的

    //有点类似于接口中定义方法

    show func()

}

func main() {

dog := annimal2{name:"xiaohuang",

        show: func() {

            fmt.Println("this is xiaohuang")

        },

    }

    dog.show()

    cat:= annimal2{name:"xiaohong",

        show: func() {

            fmt.Println("this is xiaohong")

        },

    }

    cat.show()

}

运行结果:

this is xiaohuang

this is xiaohong

Process finished with exit code 0

©著作权归作者所有:来自51CTO博客作者故新的原创作品,如需转载,请注明出处,否则将追究法律责任


0人推荐
随时随地看视频
慕课网APP