Go语言中的Struct结构体

一、Struct结构体

Go语言中没有像C#、Java一样的Class,只有Struct这样的结构体。Go语言使用type关键字来定义一个类型。

如下:

type User struct {
   Name string
   Age int32
   Sex int16
   AvatarUrl string
}

二、Struct的声明以及初始化

初始化方法一:直接定义,通过变量名.成员名的方式赋值

//初始化方法1
var user1 User
user1.Name = "BigOrange"
user1.Age = 20
user1.Sex = 1
user1.AvatarUrl = "xxxxxxx"

fmt.Println("User1:",user1)

初始化方法二:直接通过{}进行初始化,这点和C#不一样,C#初始化的时候一般用new,例如 var user = new User{xxxxx,xxxxx,xxxx}

//初始化方法2
var user2 User = User{
   Name:"BigBanana",
   Age:23,
   Sex:0,
   AvatarUrl:"yyyyyyyyyyy",
}

fmt.Println("User2:",user2)

//初始化方法2简化
 user3 := User{
   Name:"BigBanana",
   Age:23,
   Sex:0,
   AvatarUrl:"yyyyyyyyyyy",
}

fmt.Println("User3:",user3)

三、Struct的指针

Struct的指针比较简单,就是通过&获取地址,此外还可以用new来返回一个对象的指针

方式一

var user4 *User = &User{
    Name:"BigPeach",
    Age:22,
    Sex:1,
    AvatarUrl:"zzzzzzz",
 }

fmt.Println("User4:",user4)
fmt.Println("User4:",*user4)

方式二

user5 := new(User)
user5.Name="BigGrape"
user5.Age= 25
user5.Sex= 1
user5.AvatarUrl= "mmmmmmmmm"
fmt.Println("User5:",user5)
fmt.Println("User5:",*user5)

上面第二种方式可能会有些疑问,user5不是一个指针类型吗?怎么和上面的值类型一样直接用【变量名.成员】 的方式进行赋值了呢? 不是应该 (*user5).Name 这样吗?没有错!

这是GO语言实现的一个语法糖,实际上GO语言会帮我转换。

四、Struct成员的内存布局以及实现构造函数

例如下面这样的一段代码

package main

import "fmt"

type AddressDemo struct {
   addr1 int32
   addr2 int32
   addr3 int32
}

func main(){
   addr := new(AddressDemo)
   fmt.Println("add1地址:",&addr.addr1)
   fmt.Println("add2地址:",&addr.addr2)
   fmt.Println("add3地址:",&addr.addr3)
}

结果:

add1地址: 0xc042060080
add2地址: 0xc042060084
add3地址: 0xc042060088

可以看出来,addr1、addr2、addr3都是int32,都是占用了4个字节,他们的地址分配都是连续的。

For example: 下面这个User包,就实现了一个NewUser的方法,他就是构造函数

package User

type User struct {
   Name string
   Age int32
   Sex int16
   AvatarUrl string
}

func NewUser(name string , age int32,sex int16,avatarUrl string) *User{
   user:=new(User)
   user.Name = name
   user.Age = age
   user.Sex = sex
   user.AvatarUrl = avatarUrl

   return user
}

五、Struct中的匿名字段和嵌套

可以像下面这样声明:后两个字段没有名字

type Class struct {
   Name string
   int
   string
}

使用的时候,对于匿名的字段,直接赋值就可以了

class1:=Class{
   Name:"Class1",
   int:123,
   string:"sssssss",
}

fmt.Println("class1:",class1)

结构体的嵌套

type User struct {
   Name string
   Age int32
   Sex int16
   AvatarUrl string
}

type Class struct {
   Name string
}

type Student struct {
   User User
   Class Class
}

使用:

func main() {
   stu:=new(User.Student)

   stu.Class = User.Class{
      Name:"5-2",
   }

   stu.User = User.User {
       Name:"BigBanana",
      Sex:1,
      Age:12,
      AvatarUrl:"asdasdasd",
   }

   fmt.Println(stu)
}

如果是匿名结构体嵌套呢?修改一下Student

type Student struct {
   User User
   Class
}

使用在对Class这个成员进行赋值的时候,可以发现,既可以使用

stu.Class = User.Class{
   Name:"5-2",
}

也可以使用Name直接赋值,顺序就是现在当前的结构体找,找不到再从匿名结构体中查找,正好找到Class里面有Name

stu.Name = "5-2"

如果Class和User都是匿名结构嵌套,但是他们里面都有Name,当我们使用stu.Name的时候,那他访问的是Class里的Name还是User里面的Name? 那么岂不是冲突了? 如何处理冲突?

当我试图给stu.Name赋值的时候,编译器报错了,内容如下,也就是它找不到应该给谁赋值。

这时候要解决这个冲突,必须指定是哪个匿名字段里面的Name

stu:=new(User.Student)

stu.User.Name = "123123"
stu.Class.Name = "5-2"

stu.User = User.User {
   Name:"BigBanana",
   Sex:1,
   Age:12,
   AvatarUrl:"asdasdasd",
}

六、结构体内字段的可见性

和包一样,小写的字段外部不可见,大写的外部可见

七、结构体的Tag

tag是结构体的元信息,可以在运行的时候通过反射的机制读出来。

怎么写tag?

以`作为开头和结尾,中间是key-value形式的字符串,每一个键值对以,作为分隔。例如

type User struct {
   UserName string   `json:"userName",db:"User_Name"`
   Age int32         `json:"age"`
   Sex int16         `json:"sex"`
   AvatarUrl string  `json:"avatarUrl",db:"Avatar_Url"`
}

使用并运行:

func main() {

   user := User.User {
      UserName:"BigBanana",
      Sex:1,
      Age:12,
      AvatarUrl:"asdasdasd",
   }

   fmt.Println(user)

   data,_:=json.Marshal(user)

   fmt.Println(string(data))

}

结果:

{"userName":"BigBanana","age":12,"sex":1,"avatarUrl":"asdasdasd"}

可以看到,如果打了这个tag,会显示tag后面的标记名称。

此外:如果字段名称是小写,那么json输出的时候就不会有这个字段被打印了。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Golang学习笔记(六):struct

    struct struct,一组字段的集合,类似其他语言的class 放弃了大量包括继承在内的面向对象特性,只保留了组合(composition)这个最基础的特性 1.声明及初始化 复制代码 代码如下: type person struct {     name string     age  int } //初始化 func main() {     var P person P.name = "tom"     P.age = 25     fmt.Println(P.name)

  • golang struct扩展函数参数命名警告解决方法

    今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.com/zsy619/gcommon" ) //ChunkFooter 块Footer type ChunkFooter struct { ChunkDataTotalSize int } //NewChunkFooter 创建一个ChunkFooter func NewChunkFooter(chu

  • Go语言struct类型介绍

    struct 我们可以声明新的类型,作为其它类型的属性或字段容器. 如,创建一个自定义类型person代表一个人的实体.这个实体拥有属性:姓名&年龄.这样的类型我们称之为struct. 复制代码 代码如下: type person struct{         name string         age int } 复制代码 代码如下: var P person // P 现在就是 person 类型的变量了 P.name = "Astaxie" //  赋值 "

  • Golang空结构体struct{}用途,你知道吗

    golang 空结构体 struct{} 可以用来节省内存 a := struct{}{} println(unsafe.Sizeof(a)) // Output: 0 理由如下: 如果使用的是map,而且map又很长,通常会节省不少资源 空struct{}也在向别人表明,这里并不需要一个值 本例说明在map里节省资源的用途: set := make(map[string]struct{}) for _, value := range []string{"apple", "o

  • Go语言中struct的匿名属性特征实例分析

    本文实例分析了Go语言中struct的匿名属性特征.分享给大家供大家参考.具体分析如下: Go语言中struct的属性可以没有名字而只有类型,使用时类型即为属性名.(因此,一个struct中同一个类型的匿名属性只能有一个) 复制代码 代码如下: type PersonC struct {      id      int      country string  }    //匿名属性  type Worker struct {      //如果Worker有属性id,则worker.id表示

  • 解析Go语言编程中的struct结构

    struct和C语言的很相似,模拟出class的功能,但是不完全的!没有构造函数等! struct的申明 复制代码 代码如下: package main import "fmt" type Person struct {  Age  int  Name string } func main() {  //初始化两种  a := Person{}  a.Age = 2  a.Name = "widuu"  fmt.Println(a)  b := Person{   

  • golang中的struct操作

    struct是实现面向对象的重要技术,基本上都跟类型声明type name underlying-type结合使用. struct是值类型,所以它的零值是所有成员的零值.由于值类型在作为函数参数时的局限性,所以经常配合指针一起使用. 声明 type Employee struct { ID int Name string Address string } 一行一个成员,中间没有逗号或分号,大写的成员可以在包外访问. 如果类型相同,也可以考虑定义在一行,例如 type Employee struc

  • Go语言struct类型详解

    struct Go语言中,也和C或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器.例如,我们可以创建一个自定义类型person代表一个人的实体.这个实体拥有属性:姓名和年龄.这样的类型我们称之struct.如下代码所示: 复制代码 代码如下: type person struct {     name string     age int } 看到了吗?声明一个struct如此简单,上面的类型包含有两个字段. 1.一个string类型的字段name,用来保存用户名称这个属性

  • Go语言中的Struct结构体

    一.Struct结构体 Go语言中没有像C#.Java一样的Class,只有Struct这样的结构体.Go语言使用type关键字来定义一个类型. 如下: type User struct { Name string Age int32 Sex int16 AvatarUrl string } 二.Struct的声明以及初始化 初始化方法一:直接定义,通过变量名.成员名的方式赋值 //初始化方法1 var user1 User user1.Name = "BigOrange" user1

  • Go Struct结构体的具体实现

    目录 什么是结构体 1. 基本实例化(方法1) 2. new实例化(方法2) 3. 键值对初始化(方法3 结构体能够使用指针就使用指针) 结构体方法和接收者 encoding-json包 1. struct与json 2. struct tag 什么是结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.(继承,多态,封装) Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 1. 基本实例化(方法1) 只有当结构体实例化时,才会真正地分配内存(其实也就

  • 详解C++程序中定义struct结构体的方法

    什么是结构体? 简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同. 结构体的定义 定义结构体使用struct修饰符,例如: struc

  • C语言struct结构体介绍

    目录 struct struct的嵌套 实验 struct C 语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能. 下面是struct自定义数据类型的一个例子. struct tag { member-list member-list member-list ... } variable-list; 声明了数据类型car和该类型的变量car. struct car { char *name; float price; int spe

  • 深入剖析C++中的struct结构体字节对齐

    什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取.比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证

  • C语言 struct结构体超详细讲解

    目录 一.本章重点 二.创建结构体 三.typedef与结构体的渊源 四.匿名结构体 五.结构体大小 六.结构体指针 七.其他 一.本章重点 创建结构体 typedef与结构体的渊源 匿名结构体 结构体大小 结构体指针 其他 二.创建结构体 先来个简单的结构体创建 这就是一个比较标准的结构体 struct people { int age; int id; char address[10]; char sex[5]; };//不要少了分号. 需要注意的是不要少了分号. 那么这样创建结构体呢? s

  • C语言 结构体(Struct)详解及示例代码

    前面的教程中我们讲解了数组(Array),它是一组具有相同类型的数据的集合.但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放. 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为: struct 结构体名{     结构体所包含的变量或数组 }; 结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可

  • C语言结构体(struct)常见使用方法(细节问题)

    基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量. 结构体定义: 第一种:只有结构体定义 struct stuff{ char job[20]; int age; float height; }; 第二种:附加该结构体类型的"结构体变量"的初始化的结构体定义 //直接带变量名Huqinwei struct stuff{ char job[20]; int age; floa

  • 一起来了解一下C++的结构体 struct

    目录 struct 结构体 占用空间 与类的区别 访问控制权限 主要用途 c结构体实现虚函数的功能 总结 struct 结构体 占用空间 在C++ 中空结构体占1个字节 struct Temp{};sizeof(Temp); // 1struct Temp{}; sizeof(Temp); // 1 1.字节对齐规则(为了便于cpu寻址) 元素的首地址必须是当前元素所占空间的整数倍 2.结构体的总长度必须是最大元素所占空间的整数倍 struct Stu{int age;char sex;}siz

  • C语言结构体(struct)的详细讲解

    目录 引言 1. 动态内存管理 2. 结构体 2.1 定义语法 2.2 定义示例 2.3 初始化 2.4 结构体赋值 2.5 结构体数组 2.6 结构体指针赋值 3. 学生管理系统 附:结构体变量的存储原理 总结 引言 当前文章介绍动态堆空间内存分配与释放,C语言结构体定义.初始化.赋值.结构体数组.结构体指针的相关知识点,最后通过一个学生管理系统综合练习结构体数组的使用. 1. 动态内存管理 C语言代码----->编译----->链接------>可执行的二进制文件(windows下x

随机推荐