GO 结构体

Posted henryno12

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GO 结构体相关的知识,希望对你有一定的参考价值。

结构体

  1. 概念

    由一系列具有相同类型或不同类型的数据,构成的数据集合。

    结构体成员由一系列的成员变量构成,这些成员变量也被称为“字段”

    结构体也可理解为一个数据记录,结构体抛弃了面向对象类,继承等概念。

  2. 结构体的定义与初始化

    type struct_varibale_type struct{
        member definition; //member首字母大写代表public访问属性
        member definition;
        ....
        member definition;
    }
    
    type Person struct{
    	name string
    	age int
    	sex string
    	address string
    }
    
    //初始化
    //方法1
    var p1 Person
    p1.name="henry"
    p1.age = 30
    p1.sex = "男"
    p1.address = "北京"
    
    //方法2
    p2 := Person{}
    p2.name="henry"
    p2.age = 30
    p2.sex = "男"
    p2.address = "北京"
    
    //方式3
    var p1 Person = Person{name:"henry",
                           age:30,
                           sex:"男",
                           address:"北京", //注意,如果最后一个属性不跟}在同一行,需要加上,
                          }
    
    //方法4
    p2 := Person{"kaka",30,"男","巴西"}
    
  3. 结构体是值类型

  4. make,new操作

    make用于内建类型(slice,map,channel)的内存分配。new用于各种类型的内存分配,内建函数new本质上说跟其他语言中的同名函数功能一样:new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。用GO的术语说,它返回了一个指针,指向新分配的类型T的零值。有一点非常重要:new返回指针。

    内建函数make(T,args)与new(T)有着不同的功能,make只能创建slice,map,channel,并且返回一个有初始值(非零)的T类型,而不是*T。本质来讲,导致这三个类型有所不同的原因是指向数据结构的引用在使用前必须初始化。例如,一个slice,是一个包含指向数据(内部array)的指针、长度和容量的三项描述符;在这些项目被初始化之前,slice为nil。对于slice,map和channel来说,make初始化了内部的数据结构,填充适当的值。

  5. 结构体指针

    var pp1 *Person
    pp1 = &p1
    
    (*pp1).name
    pp1.name
    //以上两种通过结构体指针,访问结构体属性的方式,作用相同
    
  6. new创建结构体

    //返回指向类型T零值空间的指针
    p4 := new(Person)
    fmt.Printf("%T
    ",p4) //*main.Person
    
  7. 匿名结构体

    1. 概念:没有名字的结构体,在创建匿名结构体时同时创建对象

    2. 变量名 := struct{
          定义字段
      }{字段进行赋值}
      
      s1 := struct{
      		name string
      		age int
      	}{"henry",30}
      fmt.Println(s1.name)
      
  8. 结构体匿名字段

    1. 概念:结构体的字段省略名字,只有类型

    2. type Worker struct{
      		 string
      		 int
      	}
      
      s2 := Worker{"kaka",29}
      fmt.Println(s2.string)
      
      //类型名称将成为结构体的匿名字段名,
      //但匿名字段的类型不能重复,否则会冲突
      
  9. 结构体嵌套

    1. 概念:一个结构体可能包含一个字段,而这个字段反过来是一个结构体,这样的结构就是嵌套结构。

    2. type Book struct {
      	bookName string
      	price float64
      }
      
      type Student struct {
      	name string
      	age int
      	book Book
      }
      
      book := Book{"数学",100}
      student := Student{name:"henry",
                         age:16,
                        }
      student.book = book  //值传递
      fmt.Println(student.book.bookName) //数学
      student.book.bookName = "语文"
      fmt.Println(student.book.bookName) //语文
      fmt.Println(book.bookName)//数学
      
      

以上是关于GO 结构体的主要内容,如果未能解决你的问题,请参考以下文章

[Go] gocron源码阅读-go语言的结构体

GO浪---第1浪之结构体

分享几个实用的代码片段(第二弹)

分享几个实用的代码片段(第二弹)

#yyds干货盘点#愚公系列2022年08月 Go教学课程 031-结构体方法

Go语言学习之旅--结构体