zoukankan      html  css  js  c++  java
  • GO 语言学习之结构体

    struct 结构体

    type Member struct {
       id     int
       name   string
       email  string
       gender int
       age    int
    }
    

    结构体也可以不包含任何字段,称为空结构体,struct{}表示一个空的结构体,注意,直接定义一个空的结构体并没有意义,但在并发编程中,channel之间的通讯,可以使用一个struct{}作为信号量。

    ch := make(chan struct{})
    ch <- struct{}{}
    
    # 直接定义变量,这个使用方式并没有为字段赋初始值,因此所有字段都会被自动赋予自已类型的零值,比如name的值为空字符串"",age的值为0。
    
    var m1 Member//所有字段均为空值
    
    使用字面量创建变量,这种使用方式,可以在大括号中为结构体的成员赋初始值,有两种赋初始值的方式,一种是按字段在结构体中的顺序赋值,下面代码中m2就是使用这种方式,这种方式要求所有的字段都必须赋值,因此如果字段太多,每个字段都要赋值,会很繁琐,另一种则使用字段名为指定字段赋值,如下面代码中变量m3的创建,使用这种方式,对于其他没有指定的字段,则使用该字段类型的零值作为初始化值。
    
    var m2 = Member{1,"小明","xiaoming@163.com",1,18} // 简短变量声明方式:m2 := Member{1,"小明","xiaoming@163.com",1,18}
    var m3 = Member{id:2,"name":"小红"}// 简短变量声明方式:m3 := Member{id:2,"name":"小红"}
    

    结构体特性 Important

    • 值传递

    结构体与数组一样,是复合类型,无论是作为实参传递给函数时,还是赋值给其他变量,都是值传递,即复一个副本。

    • 没有继承

    Go语言是支持面向对象编程的,但却没有继承的概念,在结构体中,可以通过组合其他结构体来构建更复杂的结构体。

    • 结构体不能包含自己

    一个结构体,并没有包含自身,比如Member中的字段不能是Member类型,但却可能是*Member。

    指针结构体

    结构体与数组一样,都是值传递,比如当把数组或结构体作为实参传给函数的形参时,会复制一个副本,所以为了提高性能,一般不会把数组直接传递给函数,而是使用切片(引用类型)代替,而把结构体传给函数时,可以使用指针结构体。

    注意,指针类型为引用类型,声明结构体指针时,如果未初始化,则初始值为nil,只有初始化后,才能访问字段或为字段赋值。
    
    var m1 *Member
    m1.name = "小明"//错误用法,未初始化,m1为nil
    
    使用Go内置new()函数,可以分配内存来初始化结构休,并返回分配的内存指针,因为已经初始化了,所以可以直接访问字段。
    var m2 = new(Member)
    m2.name = "小红"
    

    结构体的Tags

    在定义结构体字段时,除字段名称和数据类型外,还可以使用反引号为结构体字段声明元信息,这种元信息称为Tag,用于编译阶段关联到字段当中,如我们将上面例子中的结构体修改为:

    type Member struct {
        Id     int    `json:"id,-"`
        Name   string `json:"name"`
        Email  string `json:"email"`
        Gender int    `json:"gender,"`
        Age    int    `json:"age"`
    }
    

    上面例子演示的是使用encoding/json包编码或解码结构体时使用的Tag信息。

    Tag由反引号括起来的一系列用空格分隔的key:"value"键值对组成,如:

    Id int `json:"id" gorm:"AUTO_INCREMENT"`
    
  • 相关阅读:
    springboot笔记
    SpringBoot
    SpringBoot整合JPA
    Docker
    SpringMVC学习04:异常处理和拦截器
    SpringMVC学习03:文件上传
    SpringMVC学习02:响应数据和结果视图
    Mybatis学习04
    【java基础】初步理解面向对象、类、对象
    【Java基础】方法的重载
  • 原文地址:https://www.cnblogs.com/beihangxuwei/p/14377734.html
Copyright © 2011-2022 走看看