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 Tv := T{} // var v = T{} 会返回结构体变量,而 v := new(T)v := &T{} // var v = &T{} 会返回结构体指针。

4 值类型

注意,结构体是值类型,不是引用类型。因此使用不同方式实例化的,在赋值时效果时不一样的,需要注意。

var v Tv := 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部分结构体的更多相关文章

  1. C语言中的结构体

    用户自己建立自己的结构体类型 1.  定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...

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

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

  3. C语言中的结构体,结构体数组

    C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...

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

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

  5. c语言中的结构体指针类型的cast

    1.我们在c语言中会经常碰到强制类型转换. 在这,我介绍一种结构pointer类型转换,但是有前提(有点类似于c++中的继承中的子父对象的cast). 简单的介绍一下: 首先我们要知道一个结构的指针, ...

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

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

  7. C语言中处理结构体的原理

    汇编中有几种寻址方式,分别是直接寻址:(ds:[idata]).寄存器间接寻址(ds:[bx]).寄存器相对寻址(ds:[bx + idata].ds:[bx + si])基址变址寻址(ds:[bx ...

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

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

  9. C语言中两个相同类型的结构体变量之间是可以相互直接赋值的

    C语言中,在相同类型的变量间赋值时是直接内存复制的,即将他们的内存进行复制,而两个同类型的结构体变量属于同一种变量,所以赋值时是按照他们的内存分布来直接拷贝的.所以,在C语言中两个相同类型的结构体变量 ...

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

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

随机推荐

  1. python 反转字符串 [::-1]的问题

    >>> a = '12345' >>> a[:-1]'1234' -1表示最后一个,所以取第一个到最后且不包含最后一个 >>> a[1:4:2]' ...

  2. codeforces 414D Mashmokh and Water Tanks

    codeforces 414D Mashmokh and Water Tanks 题意 题解 \(a_i\):第 \(i\) 层的结点个数. \(b_i\):第 \(i\) 层初始有水的结点个数. 如 ...

  3. Who are you, What is the science

    Please read:  地球月球有多大? 我们乃至我们赖以生存的地球, 甚至是我们硕大的银河系放到茫茫大宇中真的不过是一粒尘埃, 我们司空见惯的事物,我们习以为常的生活,我们笃定信奉的科学, 是不 ...

  4. CSS(层叠样式表)基础知识

     CSS 指层叠样式表 (Cascading Style Sheets).样式定义怎样显示 HTML 元素.它通常存储在样式表中,把样式加入到 HTML 4.0 中,解决内容与表现分离的问题. 当同一 ...

  5. mysql-5.5 for linux源代码安装

    mysql-5.5 for linux源代码安装 1.使用Yum安装依赖软件包 # yum install -y gcc gcc-c++ gcc-g77 autoconf automake bison ...

  6. bzoj 4712: 洪水

    [权限题][https://www.lydsy.com/JudgeOnline/status.php?problem_id=4712&jresult=4] 这道动态\(dp\)终于不是独立集/ ...

  7. C/C++读取一行

    C语言 1. char buf[80]={0};     gets(buf);   //可以读取空格, 回车结束输入 2. char buf[10] = {0}; scanf("%[^\n] ...

  8. PHP+JQUERY+AJAX上传、裁剪图片(2)

    <script type="text/javascript"> var imgCut = { imgOpt : { imgPrototypeId : 'imgProto ...

  9. pathinfo

    location ~ \.php { fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param PATH_INFO $fastcgi_p ...

  10. Dubbo实践(六)Spring加载Bean流程

    根据上一小节对于spring扩展schema的介绍,大概可以猜到dubbo中相关的内容是如何实现的. 再来回顾Dubbo实践(一)中定义的dubbo-provider.xml: <?xml ve ...