1. 结构体的定义格式

在go语言中结果的定义格式如下:

1
2
3
type structName struct {
filedList
}

列子如下:

1
2
3
4
type Person struct {
Name string
age int
}

对上上述这种方式定义的结构体有如下几种初始化的方式

  • 默认的方式, 这种方式也是零值初始化方式

    1
    p := Person{}
  • 使用字面量进行初始化

    1
    2
    p := Person{"Joe", 19} // 注意此时必须按照顺序初始化
    pp := Person{age: 19, Name: "Joe"} // 指定fieldname方式赋值,不用按照顺序

2. 匿名结构体的使用

对于匿名结构体,可以在初始化变量的时定义,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
func main() {
user := struct {
Name string
Age int
} {Name: "joe", Age: 19 } fmt.Println(user)
} 或
user := struct {
Name string
Age int
}{"jor", 10}

同样在定义结构体时,也可以使用匿名结构体, 如下:

1
2
3
4
5
6
7
8
type User struct {
Name string
Age int
Content struct { // 匿名结构体
Tel string
Email string
}
}

对于在结构体中的匿名结构体,在初始化的时候,需要如下操作:

1
2
3
4
5
6
7
func main(){
user := {Name: 大专栏  6. Go 语言中结构体的使用"joe", Age: 10} // 对于结构体中的匿名结构体只能这样初始化
user.Content.Tel = "12306"
user.Content.Email = "214639811@qq.com"
}

注意:在GO中结构体,就是某些字段的集合,是值类型的,可以进行 ==比较的,注意必须是相同类型的结构体。

3. 结构体中的匿名字段

结构体中的匿名字段,可以是GO语言内置的,也可以是自定义的类型。GO内置的类型,例子如下:

1
2
3
4
type Person struct{
string
int
}

对于这种结构体,必须按照顺序进行初始化。

1
2
3
4
func main() {
p := Person{"joe", 10}
fmt.Println(p)
}

在go中没有继承机制,自定义类型的匿名字段在go中叫做组合继承,如下

1
2
3
4
5
6
7
8
9
type human struct{
Sex string
} type Person struct{
human // 注意:匿名字段,类型名和字段名是一致的
Name string
Age int
}

对于这种结构体的初始化,按照顺序初始化,如下

1
2
3
4
func main() {
p := Person{human{Sex: "f"}, "joe", 20}
fmt.Println(p)
}

指定字段名进行初始化

1
2
3
4
5
6
7
8
9
func main() {
p := Person{Name: "joe", Age: 10, human: human{Sex: "f"}}
p := Person{Name: "joe", Age: 10, human: human{Sex: "f"}} // 注意: 对于结构体中的匿名字段,在组合的时候,将所有的字段给了结构体
p.Sex = 'm'
p.human.Sex = 'f' // 这两种方式都可以访问。
}
// 这里就一个知识点,匿名字段的类型名和字段名称一致。

对于结构体指着的使用,就不在啰嗦了。

6. Go 语言中结构体的使用的更多相关文章

  1. C语言中结构体赋值问题的讨论

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

  2. C语言中结构体对齐问题

    C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...

  3. C语言中结构体赋值问题的讨论(转载)

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

  4. Go语言中结构体的使用-第2部分OOP

    1 概述 结构体的基本语法请参见:Go语言中结构体的使用-第1部分结构体.结构体除了是一个复合数据之外,还用来做面向对象编程.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. ...

  5. Go语言中结构体的使用-第1部分结构体

    1 概述 结构体是由成员构成的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性.结构体成员,也可称之为成员变量,字段,属性.属性要满足唯一性.结构体的概念在软件工程上 ...

  6. 关于C语言中结构体中的结构体成员导致的字节对齐问题

    关于结构体的字节对齐是什么,就不赘述,再此附上一篇文章,介绍字节对齐:http://www.linuxsong.org/2010/09/c-byte-alignment/ 这里的结构体字节对齐的数据类 ...

  7. C语言中结构体參数变量的传递

    [文章摘要] 在C语言中,结构体參数变量常常作为函数的參数来进行传递.但假设參数设置不当.会出现内存问题. 本文以实际的程序代码为例.具体地介绍怎样正确地使用结构体參数变量.为相关的开发工作提供了參考 ...

  8. C语言中结构体的访问方法解读

    在C语言中,对结构体的访问一般有两种常规方式:"."访问和"->"访问.那么两者有什么区别呢?对C语言有一定了解的同学应该知道,我们新建一个结构体的时候, ...

  9. c语言中结构体指针

    1.指向结构体的指针变量: C 语言中->是一个总体,它是用于指向结构体,如果我们在程序中定义了一个结构体,然后声明一个指针变量指向这个结构体.那么我们要用指针取出结构体中的数据.就要用到指向运 ...

随机推荐

  1. idea中maven项目依赖jar一直标红线

    网上maven仓库中无法下载某些jar包,这时候就需要手动下载,并导入maven, 导入命令demo: mvn install:install-file -DgroupId=javax.media - ...

  2. fiddler抓包可以抓到电脑数据抓不到手机上的数据------防火墙问题

    1.确保手机与电脑处于同一局域网,网络没问题,手机代理设置无误 2.确保fiddler设置没有任何问题 3.如果此时还是无法抓包,请打开控制面板----Windows防火墙------允许程序通过Wi ...

  3. 十大经典排序算法(Javascript实现)

    前言 总括: 本文结合动图详细讲述了十大经典排序算法用Javascript实现的过程. 原文博客地址:十大经典排序算法 公众号:「菜鸟学前端」,回复「666」,获取一揽子前端技术书籍 人生有情泪沾衣, ...

  4. typescript-学习使用ts-3

    函数 函数参数 参数及返回值类型 function add(x: number, y: number): number { return x + y } 可选参数 function add(x: nu ...

  5. 20190221 beautiful soup 入门

    beautiful soup 入门 Beautiful Soup 是 python 的一个库,最主要的功能是从网页抓取数据. Beautiful Soup 自动将输入文档转换为 Unicode 编码, ...

  6. vim 高级技巧

    复制粘贴 normal 或v模式下 y/d/x 复制后,p来粘贴 编辑模式 默认的 set autoindent 会导致粘贴代码会导致缩进混乱 一则可以先关掉autoindent,二则可以先设置set ...

  7. spring02-组件注册-@ComponentScan-自动扫描组件&指定扫描规则

    上一篇我们讲到,讲@Bean注解标在某个方法上,那么ioc容器启动的时候就会将方法返回值放到ioc容器中 在开发中,实际上包扫描用的比较多,接下来我们会介绍两种方式一种是基于xml,一种是基于注解. ...

  8. XEN 3166

    XEN 3166 这题原题是spj,校oj上只用判断yes no,不过也差不多 题意分析之后就是求两个东西: 字典序最小的长度为m的子序列 同时这个字典序严格大于某个字符串 用序列自动机 先尽量相同, ...

  9. 物联网应用层协议选择和分析--MQTT、CoAP 、HTTP、XMPP、SoAP

    MQTT协议 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)最早是IBM开发的一个即时通讯协议,MQTT协议是为大量计算能力有限且工作在低带宽.不 ...

  10. Matlab高级教程_第二篇:关于MATLAB转C#过程中遇到输出两组参数的问题

    1. 在matlab的m函数很可能遇到原函数[a,b] = func(a); 这样的两个输出参数. 2. 在观察C#生成后定义中我们发现: public MWArray HP(); public MW ...