Go语言中的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:,
Age:,
AvatarUrl:"asdasdasd",
}
fmt.Println(user)
data,_:=json.Marshal(user)
fmt.Println(string(data))
}
结果:
{"userName":"BigBanana","age":,"sex":,"avatarUrl":"asdasdasd"}
可以看到,如果打了这个tag,会显示tag后面的标记名称。
此外:如果字段名称是小写,那么json输出的时候就不会有这个字段被打印了。
Go语言中的Struct的更多相关文章
- C语言中的struct和typedef struct<转载>
原文:http://www.nowamagic.net/librarys/veda/detail/1785 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数 ...
- Go语言中的struct tag
有时在Go的结构体定义时会看到这样的形式: type User struct { UserId int `json:"user_id" bson:"b_user_id&q ...
- lua中如何识别C语言中的struct
不如用c写比较简单呢 都要在lua中解析好数据结构,不过也可以用ffi呢...proto.lua
- c语言中struct的初始化
C++中的struct已经和class一样,可以用构造函数初始化. C语言中的struct怎么初始化呢? typedef struct _TEST_T { int i; c ...
- C语言中qsort函数用法
C语言中qsort函数用法-示例分析 本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...
- c语言中time相关函数
工作中遇到的函数: int seed = time(NULL); srand(seed); signal(SIGINT, stop); signal(SIGUSR1, sig_usr1); 搜time ...
- 关于C语言中的typedef
在C语言中定义一个结构体,要最好使用typedef,使用typedef,实际上就是为我们的结构体起了一个新的名字,即定义了一个新的类型,在后面书写自己代码的时候,就可以直接使用自己定义的新的类型第一变 ...
- 转]解析C语言中的sizeof
解析C语言中的sizeof 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出 了其操作数的存储大小.操作数 ...
- 【翻译】go语言中的map实战
业余时间翻译,水平很差,如有瑕疵,纯属无能. 原文链接 http://blog.golang.org/go-maps-in-action go语言中的map实战 1. 简介 哈希表是计算机科学中最重要 ...
随机推荐
- python3-随机生成10位包含数字和字母的密码
方法一: 知识点:random.sample(sequence, k) 从指定序列中随机获取指定长度的片断 import random,string num=string.ascii_letters+ ...
- RAC(ReactiveCocoa)概括
ReactiveCocoa(简称RAC,以下都用RAC)是github团队开源的一套基于Cocoa并且具有FRP(Functional Reactive Programming-响应式编程)特性的框架 ...
- Java 合并、拆分PDF文档
处理PDF文档时,我们可以通过合并的方式,来任意组几个不同的PDF文件或者通过拆分将一个文件分解成多个子文件,这样的好处是对文档的存储.管理很方便.下面将通过Java程序代码介绍具体的PDF合并.拆分 ...
- SpringCloud-config分布式配置中心
为什么要统一管理微服务配置? 随着微服务不断的增多,每个微服务都有自己对应的配置文件.在研发过程中有测试环境.UAT环境.生产环境,因此每个微服务又对应至少三个不同环境的配置文件.这么多的配置文件,如 ...
- jqGrid 常用 总结 -1
这篇文章是因为,我们在做的后台项目,里面有大量的表格统计,这个不可能自己手写,所以其中的表格使用的是jqgrid. 这个插件其实使用起来还是不错的,里面有很多的功能很赞.这篇博客就是自己的的一个记录, ...
- jsp内置对象-config对象
1.概念:config对象中存储了一些Servlet初始化的数据结构,当Servlet初始化时,JSP容器通过config对象将这些信息传递给这个Servlet.一般在web.xml文件中配置Serv ...
- BestSync多终端文件资料同步利器
分享一款多终端文件同步的强力软件,windows下使用. 我这里的多终端意思是,多台电脑.移动存储.云端. 就我个人而言,实用性在于移动硬盘和电脑上都有的文件,比如保存项目资料,电脑上需要编辑,有时外 ...
- arcgis api 3.x for js 入门开发系列十七在线天地图、百度地图、高德地图(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- 升鲜宝V2.0_生鲜配送行业,对生鲜配送系统开发与实施的深度对比与思考_升鲜宝生鲜配送系统_15382353715_余东升
升鲜宝V2.0_生鲜配送行业,对生鲜配送系统开发与实施的深度对比与思考_升鲜宝生鲜配送系统_15382353715_余东升 笔者从事生鲜配送软件开发接近10年,前前后后研究了很多 ...
- fullpage 全屏插件
fullpage 全屏插件 全屏滚动效果,原生js也很好实现,主要是用 mousewheel 鼠标滚轮滚动事件, 来判断上滚动还是下滚动,之后设置每次滚动的高度为屏幕的高度即可.但是,虽然效果简单, ...