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. 简介 哈希表是计算机科学中最重要 ...
随机推荐
- cocos creator主程入门教程(五)—— 日志系统
五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 这一篇介绍日志系统的设计.一般我们开发一个demo,只会简单的用cocos提供的cc.log打印下日志, ...
- 如果你也打算学习 Spring Cloud
说到 Spring Cloud,那肯定要少不了提一下微服务框架,所谓的微服务框架就是把负责的功能拆分成比较小.功能比较单一的服务独立处理,例如单点登录服务.支付服务.订单服务等,当然如果订单功能比较复 ...
- 用v-bind:style时的问题
今天纠结了挺久一个问题,个人习惯是在HBuilder里先写好前端样式,在放.net去测试数据,但是发现一个问题 就是一个提示框跟随鼠标移动 提示框用v-bind:style绑定一个对象 DIV就是这句 ...
- 简述Servlet的基本概念
Servlet的基本概念 Servlet的概念 http协议作用于客户端-服务端.由客户端发送请求(Request),服务器端接收到数据之后,向客户端发送响应(Response),这就是请求-响应模式 ...
- 多态以及 LeetCode 每日一题
1 多态 1.1 多态性 Java 引用变量有两个类型:一个是编译时类型,一个是运行时类型.前者是代码中声明这个变量时的类型,后者是由实际对象的类型决定的.当编译类型和运行类型不一样时,产生多态. c ...
- composer windows下安装
composer windows安装 因要使用PhpSpreadsheet处理excel表格 选择composer安装 1. 下载Composer-Setup.exe 2.点击直接运行---选择ph ...
- android 卡顿 Matrix TraceCanary
转载: 通过观察大盘整体的帧率及掉帧程度,来评估并监控一些重要场景的流畅性.通过一个闭环的流程,利用 Matrix-TraceCanary 模块从客户端对卡顿进行捕捉与分析上报,通过后台聚类问题堆栈及 ...
- 一起学Android之Layout
本文简述在Android开发中布局的简单应用,属于基础知识,仅供学习分享使用. 概述 在Android UI开发中,布局类型主要有两种:LinearLayout(线性布局)和RelativeLayou ...
- 谈谈git以及如何关联github
git :一款免费.开源的分布式代码版本管理控制系统 记录当前产品代码的所有版本信息,包括历史修改信息 方便快速回退到某一个具体的版本 方便团队协作开发 可检测代码冲突.合并代码等 1.利用 git ...
- HTML语义化的理解
语义化的主要目的:用正确的标签做正确的事情. 语义化验证方法:css裸奔--去掉css样式,然后看页面是否还具有很好的可读性. 语义化意义 / 优点: 1.让页面的内容结构化 2.利于浏览器解析和SE ...