Go语言中结构体的使用-第1部分结构体
1 概述
结构体是由成员构成的复合类型。Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性。
结构体成员,也可称之为成员变量,字段,属性。属性要满足唯一性。
结构体的概念在软件工程上旧的术语叫 ADT(抽象数据类型:Abstract Data Type)
数据层面,结构体是自定义数据类型,可以理解成是由一系列具有相同或不同类型的数据构成的数据集合。因此结构体也被称之为抽象数据类型(ADT,Abstract Data Type)。
在Go语言中,结构体承担着面向对象语言中类的作用。
Go语言中,结构体本身仅用来定义属性。还可以通过接收器函数来定义方法,使用内嵌结构体来定义继承。这样使用结构体相关操作Go语言就可以实现OOP面向对象编程了。
我们先看结构体相关语法,再看OOP相关的。
2 定义语法
type identifier struct {
field1 type1
field2 type2
...
}
// 或者 同一类型的字段,可以定义在一行
type identifier struct {
field1, field2 int
}
3 实例化
Go语言提供了以下几种方法实例化:
// T表示结构体标识符,v结构体变量
var v T
v := T{} // var v = T{}
v := new(T)
v := &T{} // var v = &T{}
以上方法中,var v T
和 v := T{} // var v = T{}
会返回结构体变量,而 v := new(T)
和 v := &T{} // var v = &T{}
会返回结构体指针。
4 值类型
注意,结构体是值类型,不是引用类型。因此使用不同方式实例化的,在赋值时效果时不一样的,需要注意。
var v T
和 v := T{} // var v = T{}
值传递。v := new(T)
和 v := &T{} // var v = &T{}
引用地址传递。
Go语言会对结构体类型指针做自解析。也就是说,即使获得的是结构体指针,也不需要使用 *v
的语法。
v := &T{}
// 直接使用v.语法即可。自动解析了 *v
v.field
// 相当于,也可以这么用
(*v).field
5 初始化属性
使用类似于键值对的语法初始化结构体属性,但此处的键指的是结构体内字段:
v := T{
field1: value1,
field2: value2,
…
}
如果我们初始化全部的结构体字段,可以按照定义顺序仅仅使用数据部分即可完成初始化:
// 要满足全部字段,按照定义顺序
v := T{
value1,
value2,
value3,
}
6 .
成员访问运算符点号
要访问结构体成员,需要使用点号 .
操作符,格式为:
v.field
// 获取
fmt.Println(v.field)
// 设置
v.field = new-value
7 匿名结构体
匿名结构体没有类型名称,只有字段和类型定义,无须通过type关键字定义就可以直接使用。匿名结构体的初始化写法由结构体定义和键值对初始化两部分组成。如下所示:
v := struct {
field1 type1
field2 type2
}{
field1: value1,
field2: value2,
}
注意,匿名结构体,必须要同时初始化,不能仅仅定义匿名结构体。
当需要使用一个临时结构体类型时,可以使用匿名结构体。
第一部分完!后续部分为 构造函数,方法,继承 与OOP相关的内容。
原文出自:小韩说课
微信关注:小韩说课
Go语言中结构体的使用-第1部分结构体的更多相关文章
- C语言中的结构体
用户自己建立自己的结构体类型 1. 定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...
- C语言中结构体赋值问题的讨论
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...
- C语言中的结构体,结构体数组
C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...
- C语言中结构体对齐问题
C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...
- c语言中的结构体指针类型的cast
1.我们在c语言中会经常碰到强制类型转换. 在这,我介绍一种结构pointer类型转换,但是有前提(有点类似于c++中的继承中的子父对象的cast). 简单的介绍一下: 首先我们要知道一个结构的指针, ...
- 关于C语言中结构体中的结构体成员导致的字节对齐问题
关于结构体的字节对齐是什么,就不赘述,再此附上一篇文章,介绍字节对齐:http://www.linuxsong.org/2010/09/c-byte-alignment/ 这里的结构体字节对齐的数据类 ...
- C语言中处理结构体的原理
汇编中有几种寻址方式,分别是直接寻址:(ds:[idata]).寄存器间接寻址(ds:[bx]).寄存器相对寻址(ds:[bx + idata].ds:[bx + si])基址变址寻址(ds:[bx ...
- C语言中结构体赋值问题的讨论(转载)
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...
- C语言中两个相同类型的结构体变量之间是可以相互直接赋值的
C语言中,在相同类型的变量间赋值时是直接内存复制的,即将他们的内存进行复制,而两个同类型的结构体变量属于同一种变量,所以赋值时是按照他们的内存分布来直接拷贝的.所以,在C语言中两个相同类型的结构体变量 ...
- Go语言中结构体的使用-第2部分OOP
1 概述 结构体的基本语法请参见:Go语言中结构体的使用-第1部分结构体.结构体除了是一个复合数据之外,还用来做面向对象编程.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. ...
随机推荐
- Office Online Server 2016 部署和配置
Office Online Server 2016 部署和配置https://wenku.baidu.com/view/65faf8de846a561252d380eb6294dd88d1d23d45 ...
- MySQL 数据库--SQL语句优化
explain查询和分析sql 开发中,为满足一业务功能,使用mysql书写sql时,一条sql往往有多种写法,那么我们就需要选择执行效率比较高的sql. 因此要比较分析sql的执行过程,且同一条sq ...
- 小J学python--Exception-异常
现在我们要打开一个名为fuck的文件,fuck是不存在的,看看异常是怎么工作的 不捕获异常的情况 #打开文件 open('fuck') 执行结果 捕获所有异常 Exception是所有异常类的父类,所 ...
- 35、XpathNavigator Xpath导航器 System.Xml.XPath;
XPathNavigator类包含移动和选择XML所需元素的所有方法. 一.创建: a.如果是从XPathDocument中创建,则是只读的,只能浏览数据: b.如果是从XmlDocument中创建 ...
- Chapter 1 Secondary Sorting:Introduction
开始学习<数据算法:Hadoop/Spark大数据处理技巧>第1-5章,假期有空就摘抄下来,毕竟不是纸质的可以写写画画,感觉这样效果好点,当然复杂的东西仍然跳过.写博客越发成了做笔记的感觉 ...
- error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.co
Win10,也重新装了免费版的Visual Studio 2013 y,写MFC程序时候发现这样的提示: error MSB8031: Building an MFC project for a no ...
- PhoneGap 加速计 api 获取加速计 x 轴 y 轴 z 轴信息
一.PhoneGap 加速计 Accelerometer 对象介绍 1.主要方法 accelerometer.getCurrentAcceleration 获取当前设备在 x,y,z 轴上的加速度信息 ...
- Object-C中对“引用(reference)”的理解
http://blog.csdn.net/csz0102/article/details/25984275 注:以下讨论都是在ARC模式下 我们在iOS开发中最经常碰到的“引用(reference)” ...
- HDU - 5547 数独(回溯法)
题目链接:HDU-5547 http://acm.hdu.edu.cn/showproblem.php?pid=5547 正所谓:骗分过样例,暴力出奇迹. 解题思想(暴力出奇迹(DFS+回溯)): 1 ...
- PHP扩展模块redis安装
PHP扩展redis模块安装 当我们安装好php之后可能会忘记装一些模块,或者需要增加模块的时候我们可以使用扩展模块安装. 查看php加载了哪些模块,使用命令 /usr/local/php/bin/p ...