一、使用方式

方式3和方式4返回的是:结构体指针,编译器底层对 p.Name 做了转化 *(p).Name,方便程序员使用。

type Person struct {
Name string
Age int
} func main() {
// 方式1
var p Person
fmt.Println(p) // { 0}
var p1 = Person{}
p1.Name = "a"
p1.Age = 1
fmt.Println(p1) // {a 1} // 方式2
var p2 = Person{"b", 2}
var p3 = Person{
Name: "b",
Age: 2,
}
p4 := Person{"b", 2}
p5 := Person{
Name: "b",
Age: 2,
}
fmt.Println(p2, p3, p4, p5) // {b 2} {b 2} {b 2} {b 2} // 方式3
var p6 = new(Person) // var p6 *Person = new(Person)
/*
go的设计者,为了程序员的使用方便,底层会对 p6.Name = "c"进行处理,
相当于*(p6).Name = "c"
*/
p6.Name = "c" // *(p6).Name = "c"
p6.Age = 3 // *(p6).Age = 3
fmt.Println(p6) // &{c 3}
fmt.Println(*p6) // {c 3} // 方式4(同方式3)
var p7 = &Person{}
p7.Name = "d"
p7.Age = 4
fmt.Println(p7, *p7) // &{d 4} {d 4} var p8 = &Person{"e", 5}
fmt.Println(p8, *p8) // &{e 5} {e 5} p9 := &Person{}
p9.Name = "f"
p9.Age = 6
fmt.Println(p9, *p9) // &{f 6} {f 6} p10 := &Person{"g", 7}
fmt.Println(p10, *p10) // &{g 7} {g 7}
}

二、结构体中的指针、slice、map的默认值都是nil,即还没分配空间

type Person struct {
Name string
Age int
Score [3]float64
ptr *int
s []int
m map[string]string
} func main() {
var p Person
fmt.Println(p) // { 0 [0 0 0] <nil> [] map[]}
if p.ptr == nil {
fmt.Println("true") // true
}
if p.s == nil {
fmt.Println("true") // true
}
if p.m == nil {
fmt.Println("true") // true
}
// 使用slice和map时,一定要make!!!
p.s = make([]int, 2)
p.s[0] = 88
fmt.Println(p.s) // [88 0]
p.m = make(map[string]string, 2)
p.m["key"] = "value"
fmt.Println(p.m) // map[key:value]
}

三、结构体的tag

struct的每个字段上,可以写上一个tag,该tag可以通过反射机制获取,常见的使用场景就是序列化和反序列化。

package main

import (
"encoding/json"
"fmt"
) type Person struct{
Name string `json:"name"` // `json:"name"`就是结构体tag
Age int // `json:"age"` ,没有写tag,序列化后则为大写字母,如果字段为小写,其他包又不可见
} func main() {
person := Person{"佩奇", 18}
jsonStr, err := json.Marshal(person)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(string(jsonStr)) // {"name":"佩奇","Age":18}
}
}

四、其他

结构体的所有字段在内存中是连续的。

type Student struct {
A int
B int
C int
} func main() {
s := Student{1, 20, 300}
fmt.Println(&s.A) // 0xc00000e3a0
fmt.Println(&s.B) // 0xc00000e3a8
fmt.Println(&s.C) // 0xc00000e3b0
}

结构体是用户单独定义的类型,和其他类型进行转换时需要有完全相同的字段(名字、个数、类型)。

type A struct {
Name string
} type B struct {
Name string
} type C A // 结构体进行type重新定义(相当于取别名) func main() {
var a A
var b B
a = A(b) // 可以强转,但有前提
var c C
c = C(a) // 可以强转
fmt.Println(a, b, c)
}

Go:struct的更多相关文章

  1. Python模块:struct

    各个编程语言都有自己的数据类型,当python需要接受其他语言或者网络传输来交互数据的时候,需要考虑到python的数据类型与其他平台之间交互问题.而python的struct就是解决这个问题的. s ...

  2. C++雾中风景2:struct还是class?

    之前因为都在忙着毕业的开题答辩与投稿论文的事宜,一直没有时间更新这个系列的文章.师弟看了上一篇雾中风景的文章,希望我继续把这个系列的文章写下去.坦白说,C++的特性很多,这也不是教学指南的文章,我会选 ...

  3. Go基础系列:struct和嵌套struct

    struct struct定义结构,结构由字段(field)组成,每个field都有所属数据类型,在一个struct中,每个字段名都必须唯一. 说白了就是拿来存储数据的,只不过可自定义化的程度很高,用 ...

  4. 结构类型:Struct

    一.概述: 结构类似于类,但结构为值类型,存储于栈中. 结构不能继承和被继承,但可实现接口. 结构成员访问级别有public,private(默认) ,internal. 1.简单结构 可以将无方法, ...

  5. Python:struct模块的pack、unpack

    mport struct pack.unpack.pack_into.unpack_from 1 # ref: http://blog.csdn<a href="http://lib. ...

  6. 杂项-Java:Struct

    ylbtech-杂项-Java:Struct Struts是Apache软件基金会(ASF)赞助的一个开源项目.它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目.它通过 ...

  7. Docs-.NET-C#-指南-语言参考-关键字-值类型:struct

    ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:struct 1.返回顶部 1. struct(C# 参考) 2015/07/20 struct 类型是一种值类型,通常用来封 ...

  8. golang(5):struct & 链表 & 二叉树 & 接口

    struct : 结构体 // 1. 用来自定义复杂数据结构 // 2. struct里面可以包含多个字段(属性) // 3. struct类型可以定义方法,注意和函数的区分 // 4. struct ...

  9. Go语言_更多类型:struct、slice 和映射

    更多类型:struct.slice 和映射 学习如何基于现有类型定义新的类型:本节课涵盖了结构体.数组.切片和映射. Go 作者组编写,Go-zh 小组翻译. https://tour.go-zh.o ...

  10. Go基础系列:struct的导出和暴露问题

    struct的导出和暴露问题 关于struct的导出 struct的属性是否被导出,也遵循大小写的原则:首字母大写的被导出,首字母小写的不被导出. 所以: 如果struct名称首字母是小写的,这个st ...

随机推荐

  1. Linux 系统管理命令 - vmstat - 虚拟内存统计

    命令详解 重要星级: ★★★★☆ 功能说明: vmstat 是 Virtual Memory Statistics ( 虚拟内存统计 ) 的缩写,利用 vmstat 命令可以对操作系统的内存信息.进程 ...

  2. bzoj 1951: [Sdoi2010]古代猪文 【中国剩余定理+欧拉定理+组合数学+卢卡斯定理】

    首先化简,题目要求的是 \[ G^{\sum_{i|n}C_{n}^{i}}\%p \] 对于乘方形式快速幂就行了,因为p是质数,所以可以用欧拉定理 \[ G^{\sum_{i|n}C_{n}^{i} ...

  3. [USACO 2011 Nov Gold] Cow Steeplechase【二分图】

    传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=93 很容易发现,这是一个二分图的模型.竖直线是X集,水平线是Y集,若某条竖 ...

  4. DFS和BFS模板

    DFS: 该DFS框架以2D坐标范围为例,来体现DFS算法的实现思想 #include<cstdio> #include<cstring> #include<cstdli ...

  5. TSP+Floyd BestCoder Round #52 (div.2) 1002 Victor and Machine

    题目传送门 题意:有中文版的 分析:(出题人的解题报告)我们首先需要预处理出任意两个国家之间的最短距离,因为数据范围很小,所以直接用Floyd就行了.之后,我们用f[S][i]表示访问国家的情况为S, ...

  6. B - Archer

    Problem description SmallR is an archer. SmallR is taking a match of archer with Zanoes. They try to ...

  7. Android推送服务(1)几种实现方式

    1.几种常见的解决方案实现原理 1)轮询(Pull)方式:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等.而且你还要考虑轮询的频率,如果 ...

  8. [转]在asp.net mvc中使用PartialView返回部分HTML段

    本文转自:http://blog.csdn.net/sandy945/article/details/6307750 问题链接: MVC如何实现异步调用输出HTML页面 该问题是个常见的 case, ...

  9. dotnet cors 跨域问题

    研究了一整子的.net core框架,感觉挺好用的,可以用在实际项目中,前端avalon框架也在研究: 问题:跨域,相比原来的跨域解决方案,还是有不小的变化的,原来的.net api 只需要在WebA ...

  10. Dragger2解析(一)

    依赖注入(DI-Dependency Injection) 什么是依赖注入 这是一种设计思想,一个面向对象的编程法则. DI能够让开发者写出低耦合代码,更加优良的程序. 更容易测试,代码健壮性更强. ...