![](https://img-blog.csdnimg.cn/2019092715111047.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Go
文章平均质量分 69
Go语言介绍
shiyivei
for science,art and meaning
展开
-
Go语言圣经 - 第8章 Goroutines 和 Channels - 8.5 并发的循环
第8章 Goroutines 和 ChannelsGo语言中的并发程序可以用两种手段来实现:goroutine 和 channel,其支持顺序通信进程,或被简称为CSP,CSP是一种并发编程模型,在这种并发编程模型中,值会在不同运行实例中传递,第二个手段便是多线程共享内存8.5 并发的循环本节我们来看看在并行时循环迭代的常见并发模型,我们把全尺寸图片生成一些缩略图,下面这个函数能帮我们拉伸图片,我们直接用就行了package thumbnailfunc ImageFile(infile stri原创 2022-01-12 23:47:29 · 205 阅读 · 0 评论 -
Go语言圣经 - 第7章 接口 - 7.9 表达式求值
第7章 接口接口类型是对其它类型行为的抽象和概括.接口类型不会和特定的实现细节绑定在一起,这种抽象的方式能让我们的函数更加的灵活和更具有适应能力Go语言的接口比较特殊,因为它是满足隐式实现的。也就是说,我们无需给具体类型定义所有满足足的接口类型,只需要让类型拥有一些简单必要的方法。这样我们新建一个接口类型,满足具体类型,并且我们不需要更改这些类型的定义。当我们使用的类型来自于不受我们控制的包时,这种机制比较有用7.9 表达式求值本节我们会构建一个表达式的求值器,我们使用Expr来代表Go语言中的任原创 2022-01-07 14:19:35 · 470 阅读 · 0 评论 -
Go语言圣经 - 第9章 基于共享变量的并发 - 9.6 竞争条件检测
第9章 基于共享变量的并发前一章我们使用了goroutine和channel这样直接而自然的方式来实现并发的方法,有时候它们会存在一些问题本章我们会更详细的介绍并发机制,尤其在goroutine之间共享变量,我们还会介绍goroutine和操作系统线程之间一些技术差别9.6 竞争条件检测并发程序要考虑的点事比较多的,错误在所难免,但是go的runtime和工具链给我们提供了一个动态分析分析工具,竞争检查器在go build / go run / go test 命令后加上 - race的flag,原创 2022-01-18 21:43:03 · 295 阅读 · 0 评论 -
Go语言圣经 - 第5章 函数 - 5.8 Defered函数
第5章 函数函数可以让我们将一个语句序列打包成一个单元,然后可以从程序中其他地方多次调用,函数的机制可以让我们把一个大的工作分解成小任务。前面我们已经接触过函数,本章我们将讨论函数的更多特性5.8 Defered函数在findLinks例子中,我们用http.Get的输出作为html.Parse的输入.只有URL的内容的确是HTML格式的,html.Prase才可以正常工作,但是实际上,url指向内容很丰富,可以是图片、纯文本或其它。将这些格式的内容传递给html.Parse,会产生不良后果下面的原创 2021-11-05 13:55:46 · 135 阅读 · 0 评论 -
Go语言圣经 - 第10章 包和工具 - 10.1 - 10.7
第10章 包和工具现在随便一个小程序可能就包含10000个函数,但是我们不可能一个个去构建,大部分还是来自于他人,这些函数通过类似包和模块的方式被重用go语言的包超过100个,可以在终端中使用go list std |wc -l去查看,开源包可以通过http://godoc.org来检索go带了一个工具包里面有各种简化工作区和包管理的小工具10.1 包简介包能够模块化的让我们理解和更新代码,同时包能够实现封装特性,不至于让代码变得乱,也便于我们在全球分发。Go语言的包编译起来很快,因为它有三个语言原创 2022-01-22 20:32:28 · 4095 阅读 · 0 评论 -
Go语言圣经 - 第4章 复合数据类型 - 4.5 JSON
第四章 复合数据类型基础数据类型是Go语言世界的原子复合数据类型包括四种:slice、map、 struct、array数组和结构体是聚合类型,它们的值由许多元素或成员构成,数组和结构体都是固定内存大小的数据结构,,相比之下,slice和map则是动态的数据结构,它们将根据动态增长4.5 JSONJavaScript对象表示法(JSON)是一种用于发送和接收结构化信息的标准协议。类似的协议还有XML、ASN.1和Google的Protocol Buffer等,但JASON应用的最广泛Go语言中对原创 2021-10-31 20:19:30 · 195 阅读 · 0 评论 -
Go语言圣经 - 第9章 基于共享变量的并发 - 9.8 goroutine和线程
第9章 基于共享变量的并发前一章我们使用了goroutine和channel这样直接而自然的方式来实现并发的方法,有时候它们会存在一些问题本章我们会更详细的介绍并发机制,尤其在goroutine之间共享变量,我们还会介绍goroutine和操作系统线程之间一些技术差别9.8 goroutine和线程goroutine和操作系统的线程区别只是一个量级,但是量变会导致质变,我们本节来区别一下9.8.1 动态栈一个goroutine会以一个很小的栈开始其生命周期,一般只需要2KB,它的工作机制和操作系原创 2022-01-21 15:14:24 · 329 阅读 · 0 评论 -
Go语言圣经 - 第7章 接口 - 7.3 实现接口的条件
第7章 接口接口类型是对其它类型行为的抽象和概括.接口类型不会和特定的实现细节绑定在一起,这种抽象的方式能让我们的函数更加的灵活和更具有适应能力Go语言的接口比较特殊,因为它是满足隐式实现的。也就是说,我们无需给具体类型定义所有满足足的接口类型,只需要让类型拥有一些简单必要的方法。这样我们新建一个接口类型,满足具体类型,并且我们不需要更改这些类型的定义。当我们使用的类型来自于不受我们控制的包时,这种机制比较有用7.3 实现接口的条件一个类型如果拥有一个接口所需要的所有方法,那么这个类型就算实现了这原创 2021-12-27 12:01:09 · 339 阅读 · 0 评论 -
Go语言圣经 - 第7章 接口 - 7.12 通过类型断言查询访问行为
第7章 接口接口类型是对其它类型行为的抽象和概括.接口类型不会和特定的实现细节绑定在一起,这种抽象的方式能让我们的函数更加的灵活和更具有适应能力Go语言的接口比较特殊,因为它是满足隐式实现的。也就是说,我们无需给具体类型定义所有满足足的接口类型,只需要让类型拥有一些简单必要的方法。这样我们新建一个接口类型,满足具体类型,并且我们不需要更改这些类型的定义。当我们使用的类型来自于不受我们控制的包时,这种机制比较有用7.12 通过类型断言查询访问行为下面的代码逻辑和net/http包中web服务器负责写原创 2022-01-09 16:17:26 · 381 阅读 · 0 评论 -
Go语言圣经 - 第11章 测试 - 11.3 测试覆盖率
第11章 测试软件测试是一个巨大的领域,但是Go语言的测试技术是相对比较低级的,它依赖一个Go test测试命令和一组按照约定方式编写的测试函数,测试命令可以运行这些函数在实践中,编写测试代码和编写程序本身并没有多大区别11.3 测试覆盖率测试永远不可能是覆盖所有情况本节,我们使用 go test命令中集成的测试覆盖率工具,来度量下面的测试覆盖率,帮助我们识别测试和期望之间的差距如下代码是一个表格驱动的测试func TestCoverage(t *testing.T) { var te原创 2022-01-23 23:08:36 · 430 阅读 · 0 评论 -
Go语言圣经 - 第6章 方法 - 6.5 示例:bit数组
第6章 方法从90年代开始,面向对象编程(OOP)就成了称霸工程界和教育界的编程范式,所以之后几乎所有大规模被应用的语言都包含了对OOP的支持,Go语言也不例外关于OOP,其实没有明确定义,但是大概的意思是,一个对象其实也就是一个简单的值或者一个变量,在这个对象中会包含一些方法,而一个方法则是一个一个和特殊类型相关联的函数,一个面向对象的程序会用方法来表达其属性和对应的操作,这样使用这个对象的用户就不需要直接去操作对象,而是借助方法来做这些事情在早些章节,其实我们已经使用过标准库提供的一些方法,比如t原创 2021-11-12 16:47:46 · 508 阅读 · 0 评论 -
Go语言圣经 - 第5章 函数 - 5.5 函数值
第5章 函数函数可以让我们将一个语句序列打包成一个单元,然后可以从程序中其他地方多次调用,函数的机制可以让我们把一个大的工作分解成小任务。前面我们已经接触过函数,本章我们将讨论函数的更多特性5.5 函数值函数值赋值给变量在Go中,函数被看作第一类值:函数像其它值一样,拥有类型,可以被赋值给其它变量,传递函数,从函数返回。对函数值的调用类似函数的调用func square(n int) int { return n * n }func negative(n int) int { re原创 2021-11-03 09:20:27 · 173 阅读 · 0 评论 -
Go语言圣经 - 第4章 复合数据类型 - 4.4 结构体
第四章 复合数据类型基础数据类型是Go语言世界的原子复合数据类型包括四种:slice、map、 struct、array数组和结构体是聚合类型,它们的值由许多元素或成员构成,数组和结构体都是固定内存大小的数据结构,,相比之下,slice和map则是动态的数据结构,它们将根据动态增长4.4 结构体结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体,每个值称为结构体的成员结构体及结构体类型变量的声明我们定一个结构体处理公司的员工信息,结构体成员的类型相同可以合并到一行type E原创 2021-10-31 15:59:38 · 147 阅读 · 0 评论 -
Go语言圣经 - 第7章 接口 - 7.1 接口是合约
第7章 接口接口类型是对其它类型行为的抽象和概括.接口类型不会和特定的实现细节绑定在一起,这种抽象的方式能让我们的函数更加的灵活和更具有适应能力Go语言的接口比较特殊,因为它是满足隐式实现的。也就是说,我们无需给具体类型定义所有满足足的接口类型,只需要让类型拥有一些简单必要的方法。这样我们新建一个接口类型,满足具体类型,并且我们不需要更改这些类型的定义。当我们使用的类型来自于不受我们控制的包时,这种机制比较有用7.1 接口是合约截至目前,我们都学的时具体类型,一个具体类型除了代表一个值之外,还展示原创 2021-12-27 11:52:39 · 327 阅读 · 0 评论 -
Go语言圣经 - 第8章 Goroutines 和 Channels - 8.10 示例:聊天服务
第8章 Goroutines 和 ChannelsGo语言中的并发程序可以用两种手段来实现:goroutine 和 channel,其支持顺序通信进程,或被简称为CSP,CSP是一种并发编程模型,在这种并发编程模型中,值会在不同运行实例中传递,第二个手段便是多线程共享内存8.10 示例:聊天服务现在我们要用一个案例来终结本章(虽然我们前面也讲的是案例)。现在我们构建一个程序,用户可以通过这个服务器向其他所有用户广播文本消息我们来构建这个程序package mainimport ( "bufi原创 2022-01-16 12:27:14 · 114 阅读 · 0 评论 -
Go语言圣经 - 第8章 Goroutines 和 Channels - 8.4 Channels
第8章 Goroutines 和 ChannelsGo语言中的并发程序可以用两种手段来实现:goroutine 和 channel,其支持顺序通信进程,或被简称为CSP,CSP是一种并发编程模型,在这种并发编程模型中,值会在不同运行实例中传递,第二个手段便是多线程共享内存8.4 Channels我们可以把goroutine看成并发体,把channel看成它们之间的通信机制,有了这个,独立的goroutine可以通过它来发送数据,channel根据具体的数据类型不同也不同比如 channel int 和原创 2022-01-11 23:28:04 · 256 阅读 · 0 评论 -
Go语言圣经 - 第7章 接口 - 7.4 flag.Value接口
第7章 接口接口类型是对其它类型行为的抽象和概括.接口类型不会和特定的实现细节绑定在一起,这种抽象的方式能让我们的函数更加的灵活和更具有适应能力Go语言的接口比较特殊,因为它是满足隐式实现的。也就是说,我们无需给具体类型定义所有满足足的接口类型,只需要让类型拥有一些简单必要的方法。这样我们新建一个接口类型,满足具体类型,并且我们不需要更改这些类型的定义。当我们使用的类型来自于不受我们控制的包时,这种机制比较有用7.4 flag.Value接口我们来看一个标准的接口类型flag.Value,它能够帮原创 2021-12-27 17:02:15 · 412 阅读 · 0 评论 -
Go语言圣经 - 第9章 基于共享变量的并发 - 9.5 sync.Once惰性初始化
第9章 基于共享变量的并发前一章我们使用了goroutine和channel这样直接而自然的方式来实现并发的方法,有时候它们会存在一些问题本章我们会更详细的介绍并发机制,尤其在goroutine之间共享变量,我们还会介绍goroutine和操作系统线程之间一些技术差别9.5 sync.Once惰性初始化一般情况下,在程序的刚开始就对变量进行初始化其实成本比较大,这会增加启动时间,但如果在使用的时候再去初始化变量,这会是一个比较好的方式,我们来看一下早些时候的一个变量var icons map[st原创 2022-01-18 21:41:58 · 264 阅读 · 0 评论 -
Go语言圣经 - 第5章 函数 - 5.9 Panic异常
第5章 函数函数可以让我们将一个语句序列打包成一个单元,然后可以从程序中其他地方多次调用,函数的机制可以让我们把一个大的工作分解成小任务。前面我们已经接触过函数,本章我们将讨论函数的更多特性5.9 Panic异常Go的类型系统会在编译时捕获很多错误,但是有些错误只能在运行时检查,如数组访问越界、空指针引用等,这些运行时检查出的错误会引起panic一般而言,当发生panic时,程序会中断运行,并立即执行在该goroutine中被延迟的函数(defer机制)。随后,程序崩溃并输出日志信息,日志信息包含原创 2021-11-05 17:50:41 · 429 阅读 · 0 评论 -
Go语言圣经 - 第11章 测试 - 11.4 - 11.6
第11章 测试软件测试是一个巨大的领域,但是Go语言的测试技术是相对比较低级的,它依赖一个Go test测试命令和一组按照约定方式编写的测试函数,测试命令可以运行这些函数在实践中,编写测试代码和编写程序本身并没有多大区别11.4 基准测试基准测试是测量一个程序在固定工作负载下的性能。在Go语言中,基准测试函数和普通测试函数写法类似,但是以Benchmark为前缀,并且带有一个*testing.B类型的参数。testing.B参数除了提供和testing.T类似的用法,还有一些额外和性能测量相关的方法原创 2022-01-24 21:17:39 · 281 阅读 · 0 评论 -
Go语言圣经 - 第9章 基于共享变量的并发 - 9.1 竞争条件
第9章 基于共享变量的并发前一章我们使用了goroutine和channel这样直接而自然的方式来实现并发的方法,有时候它们会存在一些问题本章我们会更详细的介绍并发机制,尤其在goroutine之间共享变量,我们还会介绍goroutine和操作系统线程之间一些技术差别9.1 竞争条件一般情况下,我们无法推断两个goroutine中的程序执行的顺序,因此我称它为并发的一个函数在并发的程序中仍可以正常工作我们就说它是并发安全的,同理,对于某个类型,如果它的操作和访问它的方法都能够正常工作的话,那这个类原创 2022-01-17 23:31:08 · 217 阅读 · 0 评论 -
Go语言圣经 - 第7章 接口 - 7.10 类型断言
第7章 接口接口类型是对其它类型行为的抽象和概括.接口类型不会和特定的实现细节绑定在一起,这种抽象的方式能让我们的函数更加的灵活和更具有适应能力Go语言的接口比较特殊,因为它是满足隐式实现的。也就是说,我们无需给具体类型定义所有满足足的接口类型,只需要让类型拥有一些简单必要的方法。这样我们新建一个接口类型,满足具体类型,并且我们不需要更改这些类型的定义。当我们使用的类型来自于不受我们控制的包时,这种机制比较有用7.10 类型断言类型断言是一个使用在接口值上的操作。语法上看起来像x.(T)被称为断言原创 2022-01-07 17:54:30 · 142 阅读 · 0 评论 -
Go语言圣经 - 第8章 Goroutines 和 Channels - 8.3 示例:并发的Echo服务
第8章 Goroutines 和 ChannelsGo语言中的并发程序可以用两种手段来实现:goroutine 和 channel,其支持顺序通信进程,或被简称为CSP,CSP是一种并发编程模型,在这种并发编程模型中,值会在不同运行实例中传递,第二个手段便是多线程共享内存8.3 示例:并发的Echo服务上一节中clock1服务器中,每一个连接都会创建一个goroutine。现在我们创建一个echo服务器,它的每个连接会有多个Goroutine。大多数echo会返回它们读取到的内容,就下下面这个函数一样原创 2022-01-11 23:25:54 · 303 阅读 · 0 评论 -
Go语言圣经 - 第8章 Goroutines 和 Channels - 8.8 示例:并发的目录遍历
第8章 Goroutines 和 ChannelsGo语言中的并发程序可以用两种手段来实现:goroutine 和 channel,其支持顺序通信进程,或被简称为CSP,CSP是一种并发编程模型,在这种并发编程模型中,值会在不同运行实例中传递,第二个手段便是多线程共享内存8.8 示例:并发的目录遍历在本小节中,我们来写一个程序,生成指定目录的硬盘使用情况报告,这个程序和Unix里的du工具比较相似。大多数工作用下面的walkDir函数来完成,这个函数使用dirents函数来枚举一个目录下的所有入口f原创 2022-01-16 09:21:49 · 223 阅读 · 0 评论 -
Go语言圣经 - 第10章 包和工具 - 10.7 工具
第10章 包和工具现在随便一个小程序可能就包含10000个函数,但是我们不可能一个个去构建,大部分还是来自于他人,这些函数通过类似包和模块的方式被重用go语言的包超过100个,可以在终端中使用go list std |wc -l去查看,开源包可以通过http://godoc.org来检索go带了一个工具包里面有各种简化工作区和包管理的小工具10.7 工具现在我们再来看看go语言工具箱中的具体功能,包括如何下载、格式化、构建、测试和安装Go语言编写的程序Go语言的工具箱集合了一系列功能的命令集,它原创 2022-01-23 13:38:22 · 8539 阅读 · 0 评论 -
Go语言圣经 - 第4章 复合数据类型 - 4.3 Map
第四章 复合数据类型基础数据类型是Go语言世界的原子复合数据类型包括四种:slice、map、 struct、array数组和结构体是聚合类型,它们的值由许多元素或成员构成,数组和结构体都是固定内存大小的数据结构,,相比之下,slice和map则是动态的数据结构,它们将根据动态增长4.3 Map哈希表是一种非常巧妙的数据结构,它是一个无序key/value对的集合,通过给定的key,可以在常熟时间复杂度内检索、更新或者删除value一个map就是一个哈希表的引用,map类型可以写成map[K]V原创 2021-10-31 12:02:55 · 197 阅读 · 0 评论 -
Go语言圣经 - 第2章 程序结构
第2章 程序结构Go语言和其它语言一样,一个大的程序是由很多程序构件组成的。变量保存值,各种运算组成表达式,基础类型被聚合成为结构体、数组等更复杂的数据类型。然后使用for和if来组织和控制表达式的执行流程,然后多个语句被组织到一个函数中,以便代码的隔离和复用。函数以源文件和包的方式被组织2.1 命名Go语言中变量名、函数名、常量名、类型名、语句标号和包名等所有命名都遵循两条基本的准则:以字母或者下划线开头,大写意味着可以导出,也就是说可以被外部包访问区分大小写Go语言中有25个关键字,关键字只原创 2021-10-23 23:16:38 · 202 阅读 · 0 评论 -
Go语言圣经 - 第8章 Goroutines 和 Channels - 8.6 示例:并发的Web爬虫
第8章 Goroutines 和 ChannelsGo语言中的并发程序可以用两种手段来实现:goroutine 和 channel,其支持顺序通信进程,或被简称为CSP,CSP是一种并发编程模型,在这种并发编程模型中,值会在不同运行实例中传递,第二个手段便是多线程共享内存8.6 示例:并发的Web爬虫我们之前做了一个web爬虫,采用的广度优先算法来抓取网页,我们来复原一下这个函数func crawl(url string) []string { fmt.Println(url) list,err原创 2022-01-13 23:20:45 · 231 阅读 · 0 评论 -
Go语言圣经 - 第5章 函数 - 5.10 Recover捕获异常
第5章 函数函数可以让我们将一个语句序列打包成一个单元,然后可以从程序中其他地方多次调用,函数的机制可以让我们把一个大的工作分解成小任务。前面我们已经接触过函数,本章我们将讨论函数的更多特性5.10 Recover捕获异常通常来说,我们不应该对panic异常做任何处理,但是有时候可以恢复。例如:Web服务器遇到不可预料的严重问题时,奔溃前应该关闭所有链接,如果不做处理,那客户端一直会处于等待状态。如果Web服务器还在开发阶段,服务器甚至可以将异常信息反馈到客户端,帮调试如果在deferred函数中原创 2021-11-06 11:53:41 · 170 阅读 · 0 评论 -
Go语言圣经 - 第7章 接口 - 7.11 基于类型断言区别错误类
第7章 接口接口类型是对其它类型行为的抽象和概括.接口类型不会和特定的实现细节绑定在一起,这种抽象的方式能让我们的函数更加的灵活和更具有适应能力Go语言的接口比较特殊,因为它是满足隐式实现的。也就是说,我们无需给具体类型定义所有满足足的接口类型,只需要让类型拥有一些简单必要的方法。这样我们新建一个接口类型,满足具体类型,并且我们不需要更改这些类型的定义。当我们使用的类型来自于不受我们控制的包时,这种机制比较有用7.11 基于类型断言区别错误类思考一下os包返回的错误集合。I/O可以因为各种原因失败原创 2022-01-09 16:15:54 · 210 阅读 · 0 评论 -
Go语言圣经 - 前言
前言Go是一个开源的编程语言,它非常适用于构建简单、可靠和高效的软件Go语言设计了全新、有效的和并发编程相关的特性,同时对数据抽象和面向对象编程的支持也很灵活,还集成了自动垃圾收集技术,这样能够更好的管理内存Go语言适用于:1)编写网络服务相关的基础设施;2)开发工具软件和系统软件;3)它是一门通用语言,可以用于图形图像驱动编程、移动应用程序开发和机器学习等诸多领域。另外,Go语言也成为了无类型脚本语言的替代者,因为它编写的程序通常比脚本语言运行的更快、更安全,而且更少发生意外类型的错误Go语言还是原创 2021-10-11 15:43:48 · 115 阅读 · 0 评论 -
Go语言圣经 - 第11章 测试 - 11.1 go test & 11.2 测试函数
第11章 测试软件测试是一个巨大的领域,但是Go语言的测试技术是相对比较低级的,它依赖一个Go test测试命令和一组按照约定方式编写的测试函数,测试命令可以运行这些函数在实践中,编写测试代码和编写程序本身并没有多大区别11.1 go testgo test 命令是一个按照一定的约定和组织来测试代码的程序。在包目录内,所以有以 _test.go为后缀名的源文件在执行go build时不会被构建成包的一部分在*_test.go文件中,有三种类型的函数,测试函数、基准测试函数、示例函数测试函数:以T原创 2022-01-23 22:55:54 · 759 阅读 · 0 评论 -
Go语言圣经 - 第7章 接口 - 7.8 error接口
第7章 接口接口类型是对其它类型行为的抽象和概括.接口类型不会和特定的实现细节绑定在一起,这种抽象的方式能让我们的函数更加的灵活和更具有适应能力Go语言的接口比较特殊,因为它是满足隐式实现的。也就是说,我们无需给具体类型定义所有满足足的接口类型,只需要让类型拥有一些简单必要的方法。这样我们新建一个接口类型,满足具体类型,并且我们不需要更改这些类型的定义。当我们使用的类型来自于不受我们控制的包时,这种机制比较有用7.8 error接口我们之前多次使用error,实际上它就是interface类型,这原创 2022-01-05 14:58:05 · 296 阅读 · 0 评论 -
Go语言圣经 - 第7章 接口 - 7.2 接口类型
第7章 接口接口类型是对其它类型行为的抽象和概括.接口类型不会和特定的实现细节绑定在一起,这种抽象的方式能让我们的函数更加的灵活和更具有适应能力Go语言的接口比较特殊,因为它是满足隐式实现的。也就是说,我们无需给具体类型定义所有满足足的接口类型,只需要让类型拥有一些简单必要的方法。这样我们新建一个接口类型,满足具体类型,并且我们不需要更改这些类型的定义。当我们使用的类型来自于不受我们控制的包时,这种机制比较有用7.2 接口类型接口类型具体描述了一系列方法的集合,一个实现了这些方法的具体类型是这个接原创 2021-12-27 11:57:48 · 103 阅读 · 0 评论 -
Go语言圣经 - 第4章 复合数据类型 - 4.1 数组
第四章 复合数据类型基础数据类型是Go语言世界的原子复合数据类型包括四种:slice、map、 struct、array数组和结构体是聚合类型,它们的值由许多元素或成员构成,数组和结构体都是固定内存大小的数据结构,,相比之下,slice和map则是动态的数据结构,它们将根据动态增长4.1 数组数组长度和元素雷类型固定,元素可以是0个或者多个,因为其的固定特性,故在Go语言中很少直接使用,更多的是用slice,它可以动态收缩,并且功能也灵活数据访问用索引下标访问,索引下标的范围是从0到数组长度减一原创 2021-10-27 14:31:20 · 157 阅读 · 0 评论 -
Go语言圣经 - 第8章 Goroutines 和 Channels - 8.9 并发的退出
第8章 Goroutines 和 ChannelsGo语言中的并发程序可以用两种手段来实现:goroutine 和 channel,其支持顺序通信进程,或被简称为CSP,CSP是一种并发编程模型,在这种并发编程模型中,值会在不同运行实例中传递,第二个手段便是多线程共享内存8.9 并发的退出前面我们尝试了很多,主要的关注点在于如何让程序“并发”,然而我们也意识到搞大量不受控制的goroutine并不是什么好事。本节我们会介绍如果实现这种控制这个问题主要分为两类,退出单个goroutine(前面我们使用原创 2022-01-16 10:43:21 · 295 阅读 · 0 评论 -
Go语言圣经 - 第1章 入门 - 1.3 & 1.4 查找重复的行 & GIF
第1章 入门1.3 查找重复的行在1.2节,我们简单的了解了一些Go语言的基本语法,接下来我们再来看一个例子进一步学习对文件做拷贝、打印、搜索和排序、统计或类似事情的程序都有一个差不多的程序结构:一个处理输入的循环,再每个元素上执行计算处理,在处理的同时或最后产生输出。我们来通过一些案例深入理解下这种程序结构case 1:func main() { counts := make(map[string]int) input:= bufio.NewScanner(os.Stdin)原创 2021-10-13 18:31:19 · 202 阅读 · 0 评论 -
Go语言圣经 - 第5章 函数 - 5.7 可变参数
第5章 函数函数可以让我们将一个语句序列打包成一个单元,然后可以从程序中其他地方多次调用,函数的机制可以让我们把一个大的工作分解成小任务。前面我们已经接触过函数,本章我们将讨论函数的更多特性5.7 可变参数参数数量可变的函数称为可变参数函数,典型的就是fmt.Printf和类似的函数,Printf首先接收一个必备的参数,之后接收任意个数的后续参数在声明可变参数时,需要在参数列表中最后一个参数前加上…,这表示该函数会接收任意数量的该类型参数func sum(vals...int) int{原创 2021-11-04 15:13:33 · 135 阅读 · 0 评论 -
Go语言圣经 - 第9章 基于共享变量的并发 - 9.4 内存同步
第9章 基于共享变量的并发前一章我们使用了goroutine和channel这样直接而自然的方式来实现并发的方法,有时候它们会存在一些问题本章我们会更详细的介绍并发机制,尤其在goroutine之间共享变量,我们还会介绍goroutine和操作系统线程之间一些技术差别9.4 内存同步提一个问题,为什么我们在Balance中也用到了互斥条件,无论是基于channel还是基于互斥量。毕竟和存款不一样,它只由一个简单的操作组成,所以不会碰到goroutine在执行”期间“执行其它逻辑的风险。这里使用mut原创 2022-01-18 21:39:51 · 102 阅读 · 0 评论 -
Go语言圣经 - 第6章 方法 - 6.3 通过嵌入结构体来扩展类型
第6章 方法从90年代开始,面向对象编程(OOP)就成了称霸工程界和教育界的编程范式,所以之后几乎所有大规模被应用的语言都包含了对OOP的支持,Go语言也不例外关于OOP,其实没有明确定义,但是大概的意思是,一个对象其实也就是一个简单的值或者一个变量,在这个对象中会包含一些方法,而一个方法则是一个一个和特殊类型相关联的函数,一个面向对象的程序会用方法来表达其属性和对应的操作,这样使用这个对象的用户就不需要直接去操作对象,而是借助方法来做这些事情在早些章节,其实我们已经使用过标准库提供的一些方法,比如t原创 2021-11-11 10:12:04 · 492 阅读 · 0 评论