Go语言教程之结构体
Hello,大家好,我是小栈君,最近因为工作的事情延误了一点分享的进度,但是我会尽量抽时间分享关于IT干货知识,还希望大家能够持续关注“IT干货栈”哦。
闲话不多说,今天给大家继续分享关于Go语言的教程知识之结构体。
对象
在介绍结构体之前,我们先讲讲编程语言中的对象的概念吧,因为在相关的程序开发过程中,我们通常是面向对象进行编程,就是将相关的属性和方法组合成一个整体来看待。
因为对于大多数人而言,程序的编码是一个非常抽象的东西,我们要实现的功能需要具现化,比如说我要用程序语言描述出车的概念,那么它必须具有相关的属性,比如车有相关的名字,车具有长度,宽度,轮子,颜色等等。
当然车还具有相关的方法,就是能开,能停,我们还可以根据我们自己的想法,营造出特别的车,比如能喷火,能上天,能变身等等,这些行为在程序语言中就代表这一种方法。
所以千万别小瞧程序员,在程序的语言中,我们可以无所不能的。这些属性和方法的集合我们在程序编写中会将他们看作是一个整体,即对象。
我们在面向对象编程的时候通常讲了几个要求,即抽象,继承,封装和多态。面向对象的方法就是利用抽象、封装等机制,借助于对象、类、继承、消息传递等概念进行软件系统构造的软件开发方法。
Go语言Struct
简单的介绍完对象和面向对象概念之后,我们在Go语言中使用struct关键字表示一个对象,它主要是的格式如图所示:

我们定一个车的结构体,它所具有的特征就是颜色,名称,长度,当然根据我们的需求,他还可以有更多的属性,这样的一个结构体。
我们可以看做是一个对象。它主要用于定义一个复杂的数据结构。在一个struct中我们可以包含许多字段(即属性),当然在我们定义的结构体中,我们不仅可以定义相关的属性,他还可以定义相应的方法。

例如上图所示,我们定义的车,就有两个方法,一个是跑,一个是飞。它定义的方法是和我们函数定义的方法有所有区别的,这里定义的方法就是我们车这个对象独享的。
之前定义的方法是所有满足条件的都可以使用。而且在图片中,小栈君也明确的标注了,在go语言中不管是方法还是对象还包括属性都是大小写敏感的。
大写表示公开,相当于java中的public。小写表示私有,相当于java中的private,而且使用指针和不使用指针,也是两个概念,Struct中是值类型。

例如上图中,我们给car定义了两个方法,一个使用指针,一个不使用指针。同样的是改变名字。
车最原始的名字,我们定义了一个两米的红色奔驰,使用changeName()方法,这个方法用的不是指针类型。
所以我们可以看到,车的名字在使用该方法后并没有改变成保时捷,依旧是奔驰,是这个方法不生效么?其实不是。
因为struct是值传递。所以当我们不使用指针的时候,这个方法只是在该方法体内生效,出了这个方法后,是什么样子就是什么样子。

口说无凭,直接搬上例子说明。所以我们可以根据具体的需求,按需进行给我们的对象进行设置方法。[奔驰,宝马、保时捷,你们可以给我广告费啦~]。
继承
当然做过编程的同学可以知道,我们在其他编程语言中有父类的概念,也就是继承。而且在struct中是可以进行嵌套。
所以Go语言中并没有class类型,相对java,他的结构体只有struct类型,而且相比于java的继承,struct中并没有extends关键字。

如上图所示,我们就已经完成了相关的继承。SmallCar已经完美的继承了关于Car的属性。

这里也可以看到我们对我们的smallCar进行赋值,其实赋值的方式有很多种,在之前的文章中有和大家聊过这个问题。除了继承了Car的属性之外也继承了car的方法。

所以,在以后的项目或者实战中,我们可以很好的利用这个点进行我们基类的抽取,然后进行封装,以达到我们在软件编写中的封装性、高内聚。
Struct的内存布局
Go语言中的struct类型中,它的内存布局是连续性的

就按照我们之前的Car举例子,我们定义的字段顺序,就是Go语言的内存布局中的顺序。
我们来进行验证一下,看看实际的效果

其他给大家介绍一下在结构体中的字段可以不需要定义名称,这样的字段就是匿名字段,当然一种字段类型只允许出现一次。
否则Go语言也不能判定出,你在赋值的时候到底指定的是谁。
其实想和大家聊点题外话,因为工作的原因,小栈君创作的原创确实不太容易,主要是时间不够,因为想分享的东西太多,对于我自身而言也是知识的归纳和总结,做程序的讲究的是开源精神和分享精神。
所以小栈君为了避免长期断更的情况下,尽量勤分享,但是可能说篇幅不会太大,一节一节分享,毕竟之前的分享基本上是两千字或是更多,可以说是干货满满。
但是这样的篇幅写下来确实是精力跟不上,所以我会拆成小点,进行小记分享。以后我们就进行我们的小记分享,小栈君也尽力做到两天一更或一天一更。
这样大家也可以每天花3到5分钟进行了解和提高。也非常感谢大家对小栈君的关注。你的关注就是我坚持的动力,我们明天见拜了个拜
package main
import "fmt"
// IT干货栈 定义一个结构体[大小写敏感]
type Car struct {
Name string // 名称
Color string // 颜色
Length float32 // 长度
}
// 定义一个小车 结构
type SmallCar struct {
Car // 车
Height float32 // 高度
}
func (car *Car) run() {
fmt.Println(car.Name, "正在迅速行驶。。。。")
}
func (car *Car) fly() {
fmt.Println(car.Name, "正在飞行。。。。")
}
func (car Car) changeName() {
car.Name = "保时捷"
}
func (car *Car) realChangeName() {
car.Name = "宝马"
}
// IT干货栈
func main() {
var car Car
car.Name = "小栈"
car.Color = "red"
car.Length = 2.0
fmt.Println(car)
fmt.Printf("Name: %p\n", &car.Name)
fmt.Printf("Color: %p\n", &car.Color)
fmt.Printf("Length: %p\n", &car.Length)
}
Go语言教程之结构体的更多相关文章
- C语言中的结构体,结构体数组
C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...
- Go语言基础之结构体
Go语言基础之结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在G ...
- 4-17疑难点 c语言之【结构体对齐】
今天学习了结构体这一章节,了解到了结构体在分配内存的时候采取的是对齐的方式 例如: #include<stdio.h> struct test1 { int a; char b; shor ...
- C语言第九讲,结构体
C语言第九讲,结构体 一丶结构体的定义 在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据.结构体的定义形式为: struct 结构体名{ 结构体所包含的变量或数组 }; 结构体是一种 ...
- C 语言实例 - 使用结构体(struct)
C 语言实例 - 使用结构体(struct) C 语言实例 C 语言实例 使用结构体(struct)存储学生信息. 实例 #include <stdio.h> struct student ...
- Verilog缺少一个复合数据类型,如C语言中的结构体
https://mp.weixin.qq.com/s/_9UsgUQv-MfLe8nS938cfQ Verilog中的数据类型(Data Type)是分散的,缺少一个复合数据类型:把多个wire, r ...
- GO学习-(13) Go语言基础之结构体
Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...
- C语言中的结构体
用户自己建立自己的结构体类型 1. 定义和使用结构体变量 (1).结构体的定义 C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体. (2).声明一个结构体类型的一般形式为: ...
- [汇编与C语言关系]4. 结构体和联合体
用反汇编的方法研究一下C语言的结构体: #include <stdio.h> int main(int argc, char ** argv) { struct { char a; sho ...
随机推荐
- 【知识小结】PHP使用svn笔记总结
在公司里,我们要养成每天上班前更新代码,下班前提交代码的习惯,并且做好说明. svn更新代码的时候,先右键点击需要更新的项目,在team中进入资源库同步界面,选择incoming mode,显示的文件 ...
- The 'decorators' plugin requires a 'decoratorsBeforeExport' option, ...(npm start报错)
问题描述: 在npm start启动react项目的时候,出现了如下报错: The 'decorators' plugin requires a 'decoratorsBeforeExport' op ...
- 高级教程: 作出动态决策和 Bi-LSTM CRF 重点
动态 VS 静态深度学习工具集 Pytorch 是一个 动态 神经网络工具包. 另一个动态工具包的例子是 Dynet (我之所以提这个是因为使用 Pytorch 和 Dynet 是十分类似的. 如果你 ...
- mac默认截图、截图代码
苹果系统自带截图功能 1 截取全屏:快捷键(Shift+Command+3) 直接按“Shift+Command+3“快捷键组合,即可截取电脑全屏,图片自动保存在桌面. 2 截图窗口:快捷键(Sh ...
- UVa 11134 - Fabled Rooks——[问题分解、贪心法]
We would like to place n rooks, ≤ n ≤ , on a n × n board subject to the following restrictions • The ...
- 2018-2-13-win10-uwp-unix-timestamp-时间戳-转-DateTime
title author date CreateTime categories win10 uwp unix timestamp 时间戳 转 DateTime lindexi 2018-2-13 17 ...
- H3C DHCP服务器显示及维护
- 初识Maven POM
POM Project Object Model项目对象模型定义了项目的基本信息,用于描述项目如何构建,申明项目依赖,等等. pom元素: <modelVersion>4.0.0</ ...
- JavaSE基础---多线程
进程:正在进行的程序.其实就是一个应用程序运行时的内存分配空间. 线程:进程中一个程序执行控制单元,一条执行路径.进程负责的事应用程序的空间的标识,线程负责的事应用程序的执行顺序. 进程和线程的关系: ...
- dotnet Framework 源代码 · Ink
本文是分析 .NET Framework 源代码的系列,主要告诉大家微软做笔迹用的思路,怎么做的笔迹才是高性能的,用户体验比较好的.我会告诉大家源代码的思想,当然这个文章会比较无聊.如果你是想做笔迹的 ...