Golang之struct类型

简介: 一、struct         Go语言中,也有struct,定义与C语言类似,举例说明如下:         type person struct {             name string             age int         }         上面就声明了一个结构体person,包含两个字段。
一、struct
        Go语言中,也有struct,定义与C语言类似,举例说明如下:
        type person struct {
            name string
            age int
        }
        上面就声明了一个结构体person,包含两个字段。可以如下来使用这个struct:
        var P person        //P现在就是person类型的变量了
        P.name = "shicq"    //赋值给P的name属性
        P.age = 31            //赋值给P的age属性
        fmt.Printf("The person's name  is %s", P.name)    //访问P的name属性
        除了上面这种P的声明使用之外,还有两种声明使用方式:
        (1)按照顺序提供初始化值。
        P := person("Li Lei", 25)
        (2)通过field:value的方式初始化,这样可以任意顺序。
        P := person(age:24, name:"Han Meimei")     

二、匿名字段
        前文介绍了如何定义一个struct,定义的时候是字段名与其类型一一对应,实际上Go语言支持只提供类型,而不写字段名的方式,也就是匿名字段,或称为嵌入字段。当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct。下面举例说明之:
        type Human struct {
            name string
            age int
        }
        type Student struct {
            Human        //匿名字段,那么默认Student就包含了Human的所有字段
            speciality string
        }
        //初始化Student
        mark := Student(Human{"shicq", 31}, "Computer Science")
        //访问相应字段
        fmt.Println("His name is ", mark.name)
        fmt.Println("His age is ", mark.age)
        fmt.Println("His speciality is ", mark.speciality)
        我们看到Student访问属性age和name的时候,就像访问自己所拥有的字段一样。当然Student也能通过访问Human来访问这两个字段:
        mark.Human = Human{"shicq", 31}
        mark.Human.age -= 1
        不仅仅是struct字段,所有内置类型和自定义类型都可以作为匿名字段,比如slice。
        如果human中有一个叫做phone的字段,而student也有一个叫做phone的字段,该当如何呢?
        Go语言中最外层的优先访问,也就是当通过student.phone访问的时候,访问的是student里面的字段,而不是human里面的字段。
        这就允许我们可以重载通过匿名字段继承的一些字段,当然如果想访问重载后对应的匿名类型里的字段,可以通过匿名字段名来访问:
        type Human struct {
            name string
            age int
            phone string    //Human类型拥有的字段
        }
        type Employee struct {
            Human        //匿名字段Human
            speciality string
            phone string        //雇员的phone字段
        }
        Bob := Employee{Human{"Bob", 24, "777-444-xxxx"}, "Designer", "333-222"}
        fmt.Println("Bob's work phone is ", Bob.phone)                   
        fmt.Println("Bob's personal phone is ", Bob.Human.phone)        //访问Human的phone字段







 
目录
相关文章
|
1月前
|
存储 Go
Golang里空结构体struct{}的介绍和使用
【2月更文挑战第10天】Golang里空结构体struct{}的介绍和使用
37 6
|
3月前
|
存储 Go
Golang底层原理剖析之slice类型与扩容机制
Golang底层原理剖析之slice类型与扩容机制
22 0
|
5月前
|
关系型数据库 Go PostgreSQL
golang pgx自定义PostgreSQL类型
golang的pgx驱动提供了大约70种PostgreSQL类型支持,但还是有一些类型没有涵盖,本文介绍如何自己编写代码支持特殊的类型。
75 3
|
6月前
|
安全 Go
Golang 语言的编程技巧之类型
Golang 语言的编程技巧之类型
37 0
|
6月前
|
存储 安全 编译器
Golang 语言中 map 的键值类型选择,它是并发安全的吗?
Golang 语言中 map 的键值类型选择,它是并发安全的吗?
26 0
|
6月前
|
Go
Golang 语言怎么打印结构体指针类型字段的值?
Golang 语言怎么打印结构体指针类型字段的值?
138 0
|
6月前
|
存储 安全 Go
Golang 语言 method 接收者使用值类型和指针类型的区别
Golang 语言 method 接收者使用值类型和指针类型的区别
29 0
|
3月前
|
存储 缓存 Go
Golang底层原理剖析之类型系统,接口与类型断言
Golang底层原理剖析之类型系统,接口与类型断言
45 2
|
3月前
|
存储 编译器 Go
Golang底层原理剖析之string类型与字符编码
Golang底层原理剖析之string类型与字符编码
27 0
|
9月前
|
存储 Go
Go空结构体struct {}
struct {}介绍、使用场景、和struct {}{}比较
66 0