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 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. ...
随机推荐
- ASP.NET Core 上传多文件 超简单教程
示例源码下载地址 https://qcloud.coding.net/api/project/3915794/files/4463836/download 项目地址 https://dev.tence ...
- 乘风破浪:LeetCode真题_009_Palindrome Number
乘风破浪:LeetCode真题_009_Palindrome Number 一.前言 如何判断一个整型数字是回文呢,我们可能会转换成String来做,但是还有更简单的方法. 二.Palindrome ...
- php测试工具
如果是测压力有apache的ab如果要看性能则有xdebug和xhprof.还有linux的strace命令来跟踪程序的执行时的系统调用
- C/S架构的性能测试
很多人关心LR在C/S架构上如何实施性能测试,我想根本原因在于两个方面,一是很多时候脚本无法录制,即LR无法成功调用被测的应用程序,二是测试脚本即使录制下来,可读性不强,往往不能运行通过,调试时无从下 ...
- IDEA中配置Scala开发编译环境
安装JDK 因为Scala是运行在JVM平台上的,所以安装Scala之前要安装JDK. 安装Scala Windows安装Scala编译器 访问Scala官网http://www.scala-lang ...
- kvm 虚拟机
关于text模式安装的一个问题 http://serverfault.com/questions/257962/kvm-guest-installed-from-console-but-how-to- ...
- 4、RabbitMQ-消息应答与消息持久化
消息应答( Message acknowledgment) 1. Message acknowledgment(消息应答) 执行任务可能需要几秒钟.你可能想知道如果其中一个消费者开始一项长期任务并且只 ...
- python之获取文件夹下文件的绝对路径
#!/usr/bin/python #-*-conding:utf-8-*- #获取目录下文件的绝对路径 import os def getabsroute(path): listdir = os.l ...
- dataFrame 切片操作
loc——通过行标签索引行数据 # iloc——通过行号索引行数据 # ix——通过行标签或者行号索引行数据(基于loc和iloc 和at 和iat 的混合) # 同理,索引列数据也是如此! # : ...
- EF Core 2.1 支持数据库一对一关系
在使用EF Core和设计数据库的时候,通常一对多.多对多关系使用得比较多,但是一对一关系使用得就比较少了.最近我发现实际上EF Core很好地支持了数据库的一对一关系. 数据库 我们先来看看SQL ...