• 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)//数学
        
        
  • 相关阅读:
    爱奇艺RN低代码引擎:千变万化、快速搭建的万花筒
    前端性能优化实战 https://mp.weixin.qq.com/s/amaR6GJFqhW3B9TspBLWJA
    递归 回文链表
    字节跳动自研高性能微服务框架 Kitex 的演进之旅 https://mp.weixin.qq.com/s/DhraH24FuojgW26M8KdODQ
    Cigarette smokers problem
    万字长文 | 十个模型,总结产品经理沟通方法论 https://mp.weixin.qq.com/s/cfAVn1dIk8eg1ushxd0sA
    贪心 Partition Labels
    rune
    层层剖析一次 HTTP POST 请求事故
    runtime: shrink map as elements are deleted 缩容 垃圾回收 GC 内存
  • 原文地址:https://www.cnblogs.com/henryno12/p/12757385.html
Copyright © 2020-2023  润新知