iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Go语言中的Struct结构体怎么声明
  • 780
分享到

Go语言中的Struct结构体怎么声明

2023-07-02 18:07:58 780人浏览 八月长安
摘要

这篇文章主要介绍了Go语言中的Struct结构体怎么声明的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中的Struct结构体怎么声明文章都会有所收获,下面我们一起来看看吧。一、Struct结构体Go语言

这篇文章主要介绍了Go语言中的Struct结构体怎么声明的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中的Struct结构体怎么声明文章都会有所收获,下面我们一起来看看吧。

一、Struct结构体

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

如下:

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

二、Struct的声明以及初始化

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

//初始化方法1var user1 Useruser1.Name = "BigOrange"user1.Age = 20user1.Sex = 1user1.AvatarUrl = "xxxxxxx" fmt.Println("User1:",user1)

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

//初始化方法2var 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= 25user5.Sex= 1user5.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赋值的时候,编译器报错了,内容如下,也就是它找不到应该给谁赋值。

Go语言中的Struct结构体怎么声明

这时候要解决这个冲突,必须指定是哪个匿名字段里面的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输出的时候就不会有这个字段被打印了。

关于“Go语言中的Struct结构体怎么声明”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Go语言中的Struct结构体怎么声明”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Go语言中的Struct结构体怎么声明

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

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

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

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

下载Word文档
猜你喜欢
  • c++中int和double有什么区别
    int 和 double 是 c++ 的数据类型,用于表示整数和浮点数。它们的关键区别在于:1. 范围:int 为整数,double 为浮点数且范围更大;2. 存储大小:int 占 4 ...
    99+
    2024-05-14
    c++ 隐式转换
  • C++ 多线程程序测试的挑战和策略
    多线程程序测试面临不可重复性、并发错误、死锁和缺乏可视性等挑战。策略包括:单元测试:针对每个线程编写单元测试,验证线程行为。多线程模拟:使用模拟框架在控制线程调度的情况下测试程序。数据竞...
    99+
    2024-05-14
    c++ 多线程
  • c++中深拷贝和浅拷贝的应用时间
    浅拷贝复制对象指针或引用,仅适用于不含动态分配内存或简单数据结构的对象;深拷贝复制实际数据,包括动态分配内存,适用于包含动态分配内存或复杂数据结构的对象。 浅拷贝和深拷贝的应用时间 在...
    99+
    2024-05-14
    c++
  • 探索用于 C++ 服务器架构的高级数据结构
    在 c++++ 服务器架构中,选择适当的高级数据结构至关重要。哈希表用于快速数据查找,树用于表示数据层次结构,图用于表示对象之间的关系。这些数据结构在实践中有着广泛的应用,例如缓存系统、...
    99+
    2024-05-14
    c++ 数据结构 社交网络 键值对
  • fixed在c++中的作用
    fixed 关键字在 c++ 中用于将浮点数存储为固定小数,提供更高精度,尤其适用于需要高精度的金融计算。fixed 将浮点数表示为具有固定小数位数的小数,默认情况下使用十进制表示法,小...
    99+
    2024-05-14
    c++
  • insert在c++中怎么用
    insert() 函数在 c++ 中用于在容器(如 vector、set)中插入元素,提供了一种动态调整容器大小并添加新元素的方法。它需要两个参数:要插入元素的位置 (pos) 和要插入...
    99+
    2024-05-14
    c++ 标准库
  • 如何使用 Golang 构建 RESTful API 并处理 JSON 响应?
    如何使用 golang 构建和处理 json 响应的 restful api步骤:创建 golang 项目并安装 gorilla mux。定义路由并处理 http 请求。安装 json ...
    99+
    2024-05-14
    golang git
  • c++中int和long的区别
    int 和 long 都是 c++ 中的整型类型,主要区别在于范围和存储空间:范围:int 为 32 位整数,范围为 [-2^31, 2^31-1];long 为 64 位整数,范围为 ...
    99+
    2024-05-14
    c++ 数据丢失
  • c++中int a(n)和int a[n]的区别
    int a(n)声明一个不可变的整型变量,而int a[n]声明一个可修改元素的整型数组,用于存储和处理数据序列或集合。 int a(n) 和 int a[n] 在 C++ 中的区别 ...
    99+
    2024-05-14
    c++
  • C++ 多线程编程中调试和故障排除的技术
    c++++ 多线程编程的调试技巧包括:使用数据竞争分析器检测读写冲突,并使用同步机制(如互斥锁)解决。使用线程调试工具检测死锁,并通过避免嵌套锁和使用死锁检测机制来解决。使用数据竞争分析...
    99+
    2024-05-14
    c++ 多线程 故障排除 同步机制
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作