zoukankan      html  css  js  c++  java
  • 【Golang基础总结】结构体

    结构体:结构体是用户定义的类型,由若干字段组成的集合。是一个数据的封装。

    一、结构体的初始化

     1 package main
     2 
     3 import "fmt"
     4 
     5 type person struct {
     6     name string
     7     age  int
     8 }
     9 
    10 func main() {
    11     fmt.Println(person{"Bob", 20})
    12     fmt.Println(person{name: "Alice", age: 30})
    13     fmt.Println(person{name: "Fred"}) // 省略的字段将初始化为零值
    14     fmt.Println(&person{name: "Ann", age: 40})
    15     s := person{name: "Sean", age: 50}
    16     fmt.Println(s.name) // 使用点号来访问结构体
    17     sp := &s
    18     fmt.Println(sp.age) // 使用点号访问结构体指针的成员:指针会自动解引用
    19 
    20     sp.age = 51
    21     fmt.Println(sp.age)
    22     fmt.Println(s.age)
    23 }

    二、匿名字段

    当我们创建结构体时,字段可以只有类型,没有字段名。这称为匿名字段。

     1 package main
     2 
     3 import "fmt"
     4 
     5 /* 创建的person结构体中有两个匿名字段string和int */
     6 type person struct {
     7     string
     8     int
     9 }
    10 
    11 func main() {
    12     p := person{"Naveen", 50}
    13     fmt.Println(p)
    14 
    15     /* 虽然匿名字段没有名称,但其实匿名字段的名称就默认为它的类型.
    16      * 比如person结构体中,虽然字段是匿名的,但是Go默认这些字段名
    17      * 是它们各自的类型.所以person结构体中有两个名为string和int的字段
    18      */
    19     var p1 person
    20     p1.string = "Bob"
    21     p1.int = 50
    22     fmt.Println(p1)
    23 }

    三、嵌套结构体

    结构体的字段也有可能是一个结构体,这称为嵌套结构体。

     1 package main
     2 
     3 import "fmt"
     4 
     5 type address struct {
     6     city, state string
     7 }
     8 
     9 type person struct {
    10     name string
    11     age  int
    12     addr address
    13 }
    14 
    15 func main() {
    16     var p person
    17     p.name = "Naveen"
    18     p.age = 50
    19     p.addr = address{city: "Chicago", state: "Illinois"}
    20     fmt.Println("Name:", p.name)
    21     fmt.Println("Age:", p.age)
    22     fmt.Println("City:", p.addr.city)
    23     fmt.Println("State:", p.addr.state)
    24 }

    四、提升字段

    如果结构体中有匿名的结构体字段,则该匿名的结构体字段就称为提升字段。

     1 package main
     2 
     3 import "fmt"
     4 
     5 type address struct {
     6     city, state string
     7     age         int
     8 }
     9 
    10 type person struct {
    11     name    string
    12     age     int
    13     address // 这是一个提升字段
    14 }
    15 
    16 func main() {
    17     var p person
    18     p.name = "Naveen"
    19     p.age = 50
    20     p.address = address{city: "Chicago", state: "Illinois", age: 40}
    21     fmt.Println("Name:", p.name)
    22     fmt.Println("State:", p.address.state) // 由于匿名字段Go中默认字段名是类型,所以默认有address字段
    23     fmt.Println("City:", p.city)           // 提升字段,直接访问匿名结构体中的字段
    24 
    25     /* person和address都包含age字段,这时会先从外部结构体找起,
    26      * 一层一层的找,直到找到这个字段,所以会先在person结构体中找
    27      * 发现有一个age字段,于是返回.
    28      */
    29     fmt.Println("Age:", p.age) // 结果为50
    30 }

    五、参考文献

    1、https://studygolang.com/articles/12263

    2、https://books.studygolang.com/gobyexample/structs/

  • 相关阅读:
    golang中的值传递和引用传递
    链表

    hashtable(哈希表)
    TAO: Facebook’s Distributed Data Store for the Social Graph. 论文阅读笔记(上)
    Skip Lists: A Probabilistic Alternative to Balanced Trees 跳表论文阅读笔记
    【译】如何实现一个现代化电子商城搜索?(一)
    Elasticsearch搜索资料汇总
    Python 按比例获取样本数据或执行任务
    Python 按分类样本数占比生成并随机获取样本数据
  • 原文地址:https://www.cnblogs.com/LydiammZuo/p/11924841.html
Copyright © 2011-2022 走看看