- 博客(114)
- 资源 (1)
- 收藏
- 关注
原创 9.4 Go语言竞争状态简述
有并发,就有资源竞争,如果两个或者多个 goroutine 在没有相互同步的情况下,访问某个共享的资源,比如同时对该资源进行读写时,就会处于相互竞争的状态,这就是并发中的资源竞争。并发本身并不复杂,但是因为有了资源竞争的问题,就使得我们开发出好的并发程序变得复杂起来,因为会引起很多莫名其妙的问题。下面的代码中就会出现竞争状态:package mainimport ( "fmt" "runtime" "sync")var ( count int32 wg
2020-07-23 16:08:10
254
原创 9.3 Go语言并发通信
通过上一节《Go语言goroutine》的学习,关键字 go 的引入使得在Go语言中并发编程变得简单而优雅,但我们同时也应该意识到并发编程的原生复杂性,并时刻对并发中容易出现的问题保持警惕。事实上,不管是什么平台,什么编程语言,不管在哪,并发都是一个大话题。并发编程的难度在于协调,而协调就要通过交流,从这个角度看来,并发单元间的通信是最大的问题。在工程上,有两种最常见的并发通信模型:共享数据和消息。共享数据是指多个并发单元分别保持对同一个数据的引用,实现对该数据的共享。被共享的数据可能有多种形式,比如
2020-07-23 16:04:36
307
转载 windows安装minikube的正确姿势
???? 你将学到什么?Windows 下安装 minikube 的详细步骤在安装过程中可能遇到的问题及其解决方案来,今天我们来折腾一下在 Windows 操作系统安装 minikube???? 蛋尼尔:minikuke是什么东西?先来看下官方是怎么介绍的:Minikube is a tool that makes it easy to run Kubernetes locally. Minikube runs a single-node Kubernetes cluster insid
2020-07-21 16:35:45
1295
2
原创 9.2 Go语言goroutine(轻量级线程)
在编写 Socket 网络程序时,需要提前准备一个线程池为每一个 Socket 的收发包分配一个线程。开发人员需要在线程数量和 CPU 数量间建立一个对应关系,以保证每个任务能及时地被分配到 CPU 上进行处理,同时避免多个任务频繁地在线程间切换执行而损失效率。虽然,线程池为逻辑编写者提供了线程分配的抽象机制。但是,如果面对随时随地可能发生的并发和线程处理需求,线程池就不是非常直观和方便了。能否有一种机制:使用者分配足够多的任务,系统能自动帮助使用者把任务分配到 CPU 上,让这些任务尽量并发运作。这种机
2020-07-21 16:31:14
267
原创 9.1 Go语言并发简述(并发的优势)
有人把Go语言比作 21 世纪的C语言,第一是因为Go语言设计简单,第二则是因为 21 世纪最重要的就是并发程序设计,而 Go 从语言层面就支持并发。同时实现了自动垃圾回收机制。Go语言的并发机制运用起来非常简便,在启动并发的方式上直接添加了语言级的关键字就可以实现,和其他编程语言相比更加轻量。下面来介绍几个概念:进程/线程进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。线程是进程的一个执行实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
2020-07-21 16:28:21
409
原创 8.15 Go语言go mod包依赖管理工具使用详解
最早的时候,Go语言所依赖的所有的第三方库都放在 GOPATH 这个目录下面,这就导致了同一个库只能保存一个版本的代码。如果不同的项目依赖同一个第三方的库的不同版本,应该怎么解决?go module 是Go语言从 1.11 版本之后官方推出的版本管理工具,并且从 Go1.13 版本开始,go module 成为了Go语言默认的依赖管理工具。Modules 官方定义为:Modules 是相关 Go 包的集合,是源代码交换和版本控制的单元。Go语言命令直接支持使用Modules,包括记录和解析对其他模
2020-07-20 11:47:17
511
原创 8.14 Go语言flag包:命令行参数解析
在编写命令行程序(工具、server)时,我们有时需要对命令参数进行解析,各种编程语言一般都会提供解析命令行参数的方法或库,以方便程序员使用。在Go语言中的 flag 包中,提供了命令行参数解析的功能。下面我们就来看一下 flag 包可以做什么,它具有什么样的能力。这里介绍几个概念:命令行参数(或参数):是指运行程序时提供的参数;已定义命令行参数:是指程序中通过 flag.Type 这种形式定义了的参数;非 flag(non-flag)命令行参数(或保留的命令行参数):可以简单理解为 flag
2020-07-20 11:40:13
344
原创 8.13 Go语言os包用法简述
Go语言的 os 包中提供了操作系统函数的接口,是一个比较重要的包。顾名思义,os 包的作用主要是在服务器上进行系统的基本操作,如文件操作、目录操作、执行命令、信号与中断、进程、系统状态等等。os 包中的常用函数1) Hostname函数定义:func Hostname() (name string, err error)Hostname 函数会返回内核提供的主机名。2) Environ函数定义:func Environ() []stringEnviron 函数会返回所有的环境变量,返回值
2020-07-20 11:36:19
365
原创 8.12 Go语言time包:时间和日期
时间和日期是我们开发中经常会用到的,Go语言中的 time 包提供了时间显示和测量等所用的函数,本节我们就来介绍一下 time 包的基本用法。time 包简介时间一般包含时间值和时区,可以从Go语言中 time 包的源码中看出:type Time struct { // wall and ext encode the wall time seconds, wall time nanoseconds, // and optional monotonic clock reading in
2020-06-19 14:42:01
337
原创 8.11 Go语言正则表达式:regexp包
正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具。虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活,按照它的语法规则,根据需求构造出的正则表达式能够从原始文本中筛选出几乎任何你想要得到的字符组合。Go语言通过 regexp 包为正则表达式提供了官方支持,其采用 RE2 语法,除了\c、\C外,Go语言和 Perl、Python 等语言的正则基本一致。正则表达式语法规则正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")构成的文字序列,可以是单个的字符、字符集合、字
2020-06-16 18:06:25
451
原创 8.10 Go语言big包:对整数的高精度计算
实际开发中,对于超出 int64 或者 uint64 类型的大数进行计算时,如果对精度没有要求,使用 float32 或者 float64 就可以胜任,但如果对精度有严格要求的时候,我们就不能使用浮点数了,因为浮点数在内存中只能被近似的表示。Go语言中 math/big 包实现了大数字的多精度计算,支持 Int(有符号整数)、Rat(有理数)和 Float(浮点数)等数字类型。这些类型可以实现任意位数的数字,只要内存足够大,但缺点是需要更大的内存和处理开销,这使得它们使用起来要比内置的数字类型慢很多。
2020-06-16 18:01:11
984
原创 8.9 Go语言sync包与锁:限制线程对变量的访问
Go语言中 sync 包里提供了互斥锁 Mutex 和读写锁 RWMutex 用于处理并发过程中可能出现同时两个或多个协程(或线程)读或写同一个变量的情况。为什么需要锁锁是 sync 包中的核心,它主要有两个方法,分别是加锁(Lock)和解锁(Unlock)。在并发的情况下,多个线程或协程同时其修改一个变量,使用锁能保证在某一时间内,只有一个协程或线程修改这一变量。不使用锁时,在并发的情况下可能无法得到想要的结果,如下所示:package mainimport ( "fmt" "
2020-06-16 17:58:27
245
原创 8.8 Go语言import导入包——在代码中使用其他的代码
可以在一个 Go语言源文件包声明语句之后,其它非导入声明语句之前,包含零到多个导入包声明语句。每个导入声明可以单独指定一个导入路径,也可以通过圆括号同时导入多个导入路径。要引用其他包的标识符,可以使用 import 关键字,导入的包名使用双引号包围,包名是从 GOPATH 开始计算的路径,使用/进行路径分隔。默认导入的写法导入有两种基本格式,即单行导入和多行导入,两种导入方法的导入代码效果是一致的。1) 单行导入单行导入格式如下:import "包1"import "包2"2) 多行导入当
2020-06-10 16:54:42
599
原创 8.7 Go语言导出包中的标识符——让外部访问包的类型和值
在 Go语言中,如果想在一个包里引用另外一个包里的标识符(如类型、变量、常量等)时,必须首先将被引用的标识符导出,将要导出的标识符的首字母大写就可以让引用者可以访问这些标识符了。导出包内标识符下面代码中包含一系列未导出标识符,它们的首字母都为小写,这些标识符可以在包内自由使用,但是包外无法访问它们,代码如下:package mypkgvar myVar = 100const myConst = "hello"type myStruct struct {}将 myStruct 和 myCon
2020-06-10 16:50:15
333
原创 8.6 Go语言package(创建包)
包(package)是多个 Go 源码的集合,是一种高级的代码复用方案,像 fmt、os、io 等这样具有常用功能的内置包在 Go语言中有 150 个以上,它们被称为标准库,大部分(一些底层的除外)内置于 Go 本身。包要求在同一个目录下的所有文件的第一行添加如下代码,以标记该文件归属的包:package 包名包的特性如下:一个目录下的同级文件归属一个包。包名可以与其目录不同名。包名为 main 的包为应用程序的入口包,编译源码没有 main 包时,将无法编译输出可执行的文件。任何包系统
2020-06-10 16:49:05
137
原创 8.5 Go语言自定义包
包是Go语言中代码组成和代码编译的主要方式。关于包的基本信息我们已经在前面介绍过了,本节我们主要来介绍一下如何自定义一个包并使用它。到目前为止,我们所使用的例子都是以一个包的形式存在的,比如 main 包。在Go语言里,允许我们将同一个包的代码分隔成多个独立的源码文件来单独保存,只需要将这些文件放在同一个目录下即可。我们创建的自定义的包需要将其放在 GOPATH 的 src 目录下(也可以是 src 目录下的某个子目录),而且两个不同的包不能放在同一目录下,这样会引起编译错误。一个包中可以有任意多个文
2020-06-10 16:47:58
141
原创 8.4 Go语言常用内置包简介
标准的Go语言代码库中包含了大量的包,并且在安装 Go 的时候多数会自动安装到系统中。我们可以在 $GOROOT/src/pkg 目录中查看这些包。下面简单介绍一些我们开发中常用的包。1) fmtfmt 包实现了格式化的标准输入输出,这与C语言中的 printf 和 scanf 类似。其中的 fmt.Printf() 和 fmt.Println() 是开发者使用最为频繁的函数。格式化短语派生于C语言,一些短语(%- 序列)是这样使用:%v:默认格式的值。当打印结构时,加号(%+v)会增加字段名;
2020-06-08 16:50:38
353
原创 8.3 Go语言GOPATH(Go语言工作目录)
GOPATH 是 Go语言中使用的一个环境变量,它使用绝对路径提供项目的工作目录。工作目录是一个工程开发的相对参考目录,好比当你要在公司编写一套服务器代码,你的工位所包含的桌面、计算机及椅子就是你的工作区。工作区的概念与工作目录的概念也是类似的。如果不使用工作目录的概念,在多人开发时,每个人有一套自己的目录结构,读取配置文件的位置不统一,输出的二进制运行文件也不统一,这样会导致开发的标准不统一,影响开发效率。GOPATH 适合处理大量 Go语言源码、多个包组合而成的复杂工程。提示 C、C++、Jav
2020-06-08 16:48:50
735
原创 8.2 Go语言封装简介及实现细节
在Go语言中封装就是把抽象出来的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只能通过被授权的方法,才能对字段进行操作。封装的好处:隐藏实现细节;可以对数据进行验证,保证数据安全合理。如何体现封装:对结构体中的属性进行封装;通过方法,包,实现封装。封装的实现步骤:将结构体、字段的首字母小写;给结构体所在的包提供一个工厂模式的函数,首字母大写,类似一个构造函数;提供一个首字母大写的 Set 方法(类似其它语言的 public),用于对属性判断并赋值;提供一个首字母
2020-06-05 17:42:57
199
原创 8.1 Go语言包的基本概念
Go语言是使用包来组织源代码的,包(package)是多个 Go 源码的集合,是一种高级的代码复用方案。Go语言中为我们提供了很多内置包,如 fmt、os、io 等。任何源代码文件必须属于某个包,同时源码文件的第一行有效代码必须是package pacakgeName 语句,通过该语句声明自己所在的包。包的基本概念Go语言的包借助了目录树的组织形式,一般包的名称就是其源文件所在目录的名称,虽然Go语言没有强制要求包名必须和其所在的目录名同名,但还是建议包名和所在目录同名,这样结构更清晰。包可以定义在
2020-06-05 17:41:18
251
原创 7.10 Go语言error接口:返回错误信息
错误处理在每个编程语言中都是一项重要内容,通常开发中遇到的分为异常与错误两种,Go语言中也不例外。本节我们主要来学习一下Go语言中的错误处理。在C语言中通过返回 -1 或者 NULL 之类的信息来表示错误,但是对于使用者来说,如果不查看相应的 API 说明文档,根本搞不清楚这个返回值究竟代表什么意思,比如返回 0 是成功还是失败?针对这样的情况,Go语言中引入 error 接口类型作为错误处理的标准模式,如果函数要返回错误,则返回值类型列表中肯定包含 error。error 处理过程类似于C语言中的错误
2020-06-05 17:34:31
1267
原创 7.9 Go语言类型分支(switch判断空接口中变量的类型)
type-switch 流程控制的语法或许是Go语言中最古怪的语法。 它可以被看作是类型断言的增强版。它和 switch-case 流程控制代码块有些相似。 一个 type-switch 流程控制代码块的语法如下所示:switch t := areaIntf.(type) {case *Square: fmt.Printf("Type Square %T with value %v\n", t, t)case *Circle: fmt.Printf("Type Circle %T wi
2020-06-05 17:33:10
274
原创 7.8 Go语言空接口类型(interface{})
空接口是接口类型的特殊形式,空接口没有任何方法,因此任何类型都无须实现空接口。从实现的角度看,任何值都满足这个接口的需求。因此空接口类型可以保存任何值,也可以从空接口中取出原值。空接口类型类似于 C# 或 Java 语言中的 Object、C语言中的 void*、C++ 中的std::any。在泛型和模板出现前,空接口是一种非常灵活的数据抽象保存和使用的方法。空接口的内部实现保存了对象的类型和指针。使用空接口保存一个数据的过程会比直接用数据对应类型的变量保存稍慢。因此在开发中,应在需要的地方使用空
2020-06-05 17:30:40
487
原创 7.7 Go语言接口和类型之间的转换
Go语言中使用接口断言(type assertions)将接口转换成另外一个接口,也可以将接口转换为另外的类型。接口的转换在开发中非常常见,使用也非常频繁。类型断言的格式类型断言是一个使用在接口值上的操作。语法上它看起来像 i.(T) 被称为断言类型,这里 i 表示一个接口的类型和 T 表示一个类型。一个类型断言检查它操作对象的动态类型是否和断言的类型匹配。类型断言的基本格式如下:t := i.(T)其中,i 代表接口变量,T 代表转换的目标类型,t 代表转换后的变量。这里有两种可能。第一种,
2020-06-05 17:27:53
269
原创 7.6 Go语言接口的嵌套组合
在Go语言中,不仅结构体与结构体之间可以嵌套,接口与接口间也可以通过嵌套创造出新的接口。一个接口可以包含一个或多个其他的接口,这相当于直接将这些内嵌接口的方法列举在外层接口中一样。只要接口的所有方法被实现,则这个接口中的所有嵌套接口的方法均可以被调用。系统包中的接口嵌套组合Go语言的 io 包中定义了写入器(Writer)、关闭器(Closer)和写入关闭器(WriteCloser)3 个接口,代码如下:type Writer interface { Write(p []byte) (n i
2020-06-04 17:28:44
205
原创 7.5 Go语言排序(借助sort.Interface接口)
排序操作和字符串格式化一样是很多程序经常使用的操作。尽管一个最短的快排程序只要 15 行就可以搞定,但是一个健壮的实现需要更多的代码,并且我们不希望每次我们需要的时候都重写或者拷贝这些代码。幸运的是,sort 包内置的提供了根据一些排序函数来对任何序列排序的功能。它的设计非常独到。在很多语言中,排序算法都是和序列数据类型关联,同时排序函数和具体类型元素关联。相比之下,Go语言的 sort.Sort 函数不会对具体的序列和它的元素做任何假设。相反,它使用了一个接口类型 sort.Interface 来指定
2020-06-04 17:26:26
531
原创 7.4 Go语言类型断言简述
类型断言(Type Assertion)是一个使用在接口值上的操作,用于检查接口类型变量所持有的值是否实现了期望的接口或者具体的类型。在Go语言中类型断言的语法格式如下:value, ok := x.(T)其中,x 表示一个接口的类型,T 表示一个具体的类型(也可为接口类型)。该断言表达式会返回 x 的值(也就是 value)和一个布尔值(也就是 ok),可根据该布尔值判断 x 是否为 T 类型:如果 T 是具体某个类型,类型断言会检查 x 的动态类型是否等于具体类型 T。如果检查成功,类型断
2020-06-04 17:21:50
230
原创 7.3 Go语言类型与接口的关系
在Go语言中类型和接口之间有一对多和多对一的关系,下面将列举出这些常见的概念,以方便读者理解接口与类型在复杂环境下的实现关系。一个类型可以实现多个接口一个类型可以同时实现多个接口,而接口间彼此独立,不知道对方的实现。网络上的两个程序通过一个双向的通信连接实现数据的交换,连接的一端称为一个 Socket。Socket 能够同时读取和写入数据,这个特性与文件类似。因此,开发中把文件和 Socket 都具备的读写特性抽象为独立的读写器概念。Socket 和文件一样,在使用完毕后,也需要对资源进行释放。把
2020-06-04 17:19:10
147
原创 7.2 Go语言实现接口的条件
如果一个任意类型 T 的方法集为一个接口类型的方法集的超集,则我们说类型 T 实现了此接口类型。T 可以是一个非接口类型,也可以是一个接口类型。实现关系在Go语言中是隐式的。两个类型之间的实现关系不需要在代码中显式地表示出来。Go语言中没有类似于 implements 的关键字。 Go编译器将自动在需要的时候检查两个类型之间的实现关系。接口定义后,需要实现接口,调用方才能正确编译通过并使用接口。接口的实现需要遵循两条规则才能让接口可用。接口被实现的条件一:接口的方法与实现接口的类型方法格式一致在类型
2020-06-04 17:16:25
146
原创 7.1 Go语言接口声明(定义)
Go语言不是一种 “传统” 的面向对象编程语言:它里面没有类和继承的概念。但是Go语言里有非常灵活的接口概念,通过它可以实现很多面向对象的特性。很多面向对象的语言都有相似的接口概念,但Go语言中接口类型的独特之处在于它是满足隐式实现的。也就是说,我们没有必要对于给定的具体类型定义所有满足的接口类型;简单地拥有一些必需的方法就足够了。这种设计可以让你创建一个新的接口类型满足已经存在的具体类型却不会去改变这些类型的定义;当我们使用的类型来自于不受我们控制的包时这种设计尤其有用。接口类型是对其它类型行为的抽
2020-06-04 17:13:32
224
原创 6.10 Go语言数据I/O对象及操作
在Go语言中,几乎所有的数据结构都围绕接口展开,接口是Go语言中所有数据结构的核心。在实际开发过程中,无论是实现 web 应用程序,还是控制台输入输出,又或者是网络操作,都不可避免的会遇到 I/O 操作。Go语言标准库的 bufio 包中,实现了对数据 I/O 接口的缓冲功能。这些功能封装于接口 io.ReadWriter、io.Reader 和 io.Writer 中,并对应创建了 ReadWriter、Reader 或 Writer 对象,在提供缓冲的同时实现了一些文本基本 I/O 操作功能。Rea
2020-06-01 16:29:39
310
原创 6.9 Go语言链表操作
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。使用链表结构可以避免在使用数组时需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表允许插入和移除表上任意位置上的结点,
2020-06-01 16:02:11
205
原创 6.8 Go语言垃圾回收和SetFinalizer
Go语言自带垃圾回收机制(GC)。GC 通过独立的进程执行,它会搜索不再使用的变量,并将其释放。需要注意的是,GC 在运行时会占用机器资源。GC 是自动进行的,如果要手动进行 GC,可以使用 runtime.GC() 函数,显式的执行 GC。显式的进行 GC 只在某些特殊的情况下才有用,比如当内存资源不足时调用 runtime.GC() ,这样会立即释放一大片内存,但是会造成程序短时间的性能下降。finalizer(终止器)是与对象关联的一个函数,通过 runtime.SetFinalizer 来设置,
2020-05-29 16:25:01
201
原创 6.7 Go语言内嵌结构体成员名字冲突
嵌入结构体内部可能拥有相同的成员名,成员重名时会发生什么?下面通过例子来讲解。package mainimport ( "fmt")type A struct { a int}type B struct { a int}type C struct { A B}func main() { c := &C{} c.A.a = 1 fmt.Println(c)}代码说明如下:第 7 行和第 11 行分别定义了两个拥
2020-05-29 16:23:45
792
原创 6.6 Go语言初始化内嵌结构体
结构体内嵌初始化时,将结构体内嵌的类型作为字段名像普通结构体一样进行初始化,详细实现过程请参考下面的代码。车辆结构的组装和初始化:package mainimport "fmt"// 车轮type Wheel struct { Size int}// 引擎type Engine struct { Power int // 功率 Type string // 类型}// 车type Car struct { Wheel Engine}f
2020-05-28 16:57:47
425
原创 6.5 Go语言类型内嵌和结构体内嵌
结构体可以包含一个或多个匿名(或内嵌)字段,即这些字段没有显式的名字,只有字段的类型是必须的,此时类型也就是字段的名字。匿名字段本身可以是一个结构体类型,即结构体可以包含内嵌结构体。可以粗略地将这个和面向对象语言中的继承概念相比较,随后将会看到它被用来模拟类似继承的行为。Go语言中的继承是通过内嵌或组合来实现的,所以可以说,在Go语言中,相比较于继承,组合更受青睐。考虑如下的程序:package mainimport "fmt"type innerS struct { in1 int
2020-05-28 16:56:22
453
原创 6.4 Go语言构造函数
Go语言的类型或结构体没有构造函数的功能,但是我们可以使用结构体初始化的过程来模拟实现构造函数。其他编程语言构造函数的一些常见功能及特性如下:每个类可以添加构造函数,多个构造函数使用函数重载实现。构造函数一般与类名同名,且没有返回值。构造函数有一个静态构造函数,一般用这个特性来调用父类的构造函数。对于 C++ 来说,还有默认构造函数、拷贝构造函数等。多种方式创建和初始化结构体——模拟构造函数重载如果使用结构体描述猫的特性,那么根据猫的颜色和名字可以有不同种类的猫,那么不同的颜色和名字就是结
2020-05-27 17:18:37
313
原创 6.3 Go语言初始化结构体的成员变量
结构体在实例化时可以直接对成员变量进行初始化,初始化有两种形式分别是以字段“键值对”形式和多个值的列表形式,键值对形式的初始化适合选择性填充字段较多的结构体,多个值的列表形式适合填充字段较少的结构体。使用“键值对”初始化结构体结构体可以使用“键值对”(Key value pair)初始化字段,每个“键”(Key)对应结构体中的一个字段,键的“值”(Value)对应字段需要初始化的值。键值对的填充是可选的,不需要初始化的字段可以不填入初始化列表中。结构体实例化后字段的默认值是字段类型的默认值,例如 ,
2020-05-27 17:16:47
263
原创 6.2 Go语言实例化结构体——为结构体分配内存并初始化
结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正地分配内存,因此必须在定义结构体并实例化后才能使用结构体的字段。实例化就是根据结构体定义的格式创建一份与格式一致的内存区域,结构体实例与实例间的内存是完全独立的。Go语言可以通过多种方式实例化结构体,根据实际需要可以选用不同的写法。基本的实例化形式结构体本身是一种类型,可以像整型、字符串等类型一样,以 var 的方式声明结构体即可完成实例化。基本实例化格式如下:var ins T其中,T 为结构体类型,ins 为结构体的实例。
2020-05-26 16:29:55
170
原创 6.1 Go语言结构体(struct)
Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型。Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性。Go 语言中的类型可以被实例化,使用new或&构造的类型实例的类型是类型的指针。结构体成员是由一系列的成员变量构成,这些成员变量也被称为“字段”。字段有以下特性:字段拥有自己的类型和值。字段名必须唯一。字段的类型也可以是结构体,甚至是字段所在结构体的类型。关于 Go 语言的类(class)Go 语言中没有“类”的概念,也不支持“类”的
2020-05-26 16:27:25
173
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人