广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go语言中的Struct结构体
  • 169
分享到

Go语言中的Struct结构体

2024-04-02 19:04:59 169人浏览 八月长安
摘要

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

一、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输出的时候就不会有这个字段被打印了。

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

您可能感兴趣的文档:

--结束END--

本文标题: Go语言中的Struct结构体

本文链接: https://www.lsjlt.com/news/164400.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go语言中的Struct结构体
    一、Struct结构体 Go语言中没有像C#、Java一样的Class,只有Struct这样的结构体。Go语言使用type关键字来定义一个类型。 如下: type User stru...
    99+
    2022-11-13
  • Go语言中的Struct结构体怎么声明
    这篇文章主要介绍了Go语言中的Struct结构体怎么声明的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中的Struct结构体怎么声明文章都会有所收获,下面我们一起来看看吧。一、Struct结构体Go语言...
    99+
    2023-07-02
  • C语言struct结构体介绍
    目录structstruct的嵌套实验struct C 语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能。 下面是st...
    99+
    2022-11-13
  • C语言结构体struct详解
    目录结构体的概念结构体类型的声明结构体变量的创建typedef关键字结构体的嵌套结构体变量的初始化结构体成员的访问结构体的传参总结结构体的概念 结构体是由一系列具有相同类型或不同类型...
    99+
    2022-11-13
  • Go语言结构体struct详解,Go空结构体的这些妙用你知道吗?
    本文详解了Go语言结构体的各个知识点,最后介绍了空结构体的3种妙用。希望对你有帮助。 定义 结构体,是一种自定义的数据类型,由多个数据类型组合而成。用于描述一类事物相关属性。 定义方式: typ...
    99+
    2023-09-07
    golang java 算法
  • C语言之结构体(struct)详解
    目录为什么需要引入结构体struct定义typedef与#define结构体变量初始化及成员访问结构体访问总结为什么需要引入结构体 原有的数据类型不能满足需求,因此才设计了构造类型结...
    99+
    2022-11-12
  • C语言中结构体struct怎么对齐
    这篇文章主要介绍“C语言中结构体struct怎么对齐”,在日常操作中,相信很多人在C语言中结构体struct怎么对齐问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言中结构...
    99+
    2022-10-18
  • C语言结构体(struct)的详细讲解
    目录引言1. 动态内存管理2. 结构体2.1 定义语法2.2 定义示例2.3 初始化2.4 结构体赋值2.5 结构体数组2.6 结构体指针赋值3. 学生管理系统附:结构体变量的存储原...
    99+
    2022-11-13
  • C语言的struct结构体怎么创建
    本篇内容主要讲解“C语言的struct结构体怎么创建”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言的struct结构体怎么创建”吧!一、本章重点创建结构体typedef与结构体的渊源匿名结...
    99+
    2023-06-30
  • C语言 struct结构体超详细讲解
    目录一、本章重点二、创建结构体三、typedef与结构体的渊源四、匿名结构体五、结构体大小六、结构体指针七、其他一、本章重点 创建结构体typedef与结构体的渊源匿名结构体结构体大...
    99+
    2022-11-13
  • Go Struct结构体如何实现
    本文小编为大家详细介绍“Go Struct结构体如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Go Struct结构体如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是结构...
    99+
    2023-07-05
  • Go语言中Struct、继承、匿名字段和内嵌结构体源码分析
    这篇文章主要介绍“Go语言中Struct、继承、匿名字段和内嵌结构体源码分析”,在日常操作中,相信很多人在Go语言中Struct、继承、匿名字段和内嵌结构体源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-07-06
  • Go语言空结构体详解
    目录前言什么是空结构体特点地址相同大小为0原理探究使用场景集合(Set)channel中信号传输总结前言 在使用 Go 语言开发过程中,我们不免会定义结构体,但是我们定义的结构体都是...
    99+
    2022-11-13
  • Go空结构体struct{}的作用是什么
    目录前言作用使用场景实现集合类型实现空通道实现方法接收者总结前言 通过这篇文章《浅谈Go结构体的基本使用》,我们初步认识了空结构体,使用unsafe.SizeOf()方法,明确知道了...
    99+
    2023-02-16
    Go空结构体struct{} Go空结构体 Go struct{}
  • Go语言中如何使用结构体
    这篇文章将为大家详细讲解有关Go语言中如何使用结构体,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。结构体结构体是 go 语言中一个比较重要的概念,在 c  语言中也有类似的东西。由...
    99+
    2023-06-15
  • Go语言中结构体如何使用
    本篇文章为大家展示了Go语言中结构体如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。结构体Go语言中的基本数据类型可以表示一些事物的基本属性,但是当我们想表达...
    99+
    2022-10-18
  • C语言之结构体定义typedef struct用法详解
    在C语言中,使用struct关键字可以定义一个结构体类型,用于存储不同类型的数据。为了方便使用,可以使用typedef关键字给结构体...
    99+
    2023-08-09
    C语言
  • go语言string转结构体的实现
    在 Go 语言中,可以使用标准库中的 encoding/json 包将 JSON 格式的字符串转换为结构体。 假设有以下 JSON 字符串: { "name": "鸡哥", ...
    99+
    2023-03-19
    go语言string转结构体 go string 结构体
  • Go语言的结构体如何使用
    这篇文章主要介绍“Go语言的结构体如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Go语言的结构体如何使用”文章能帮助大家解决问题。定义结构体,是一种自定义的数据类型,由多个数据类型组合而成。...
    99+
    2023-07-05
  • go语言结构体指的是什么
    这篇文章主要介绍“go语言结构体指的是什么”,在日常操作中,相信很多人在go语言结构体指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”go语言结构体指的是什么”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作