新年彩蛋 | 完整版思考题答案 基础概念篇 Go 语言在多个工作区中查找依赖包的时候是以怎样的顺序进行的? 答:你设置的环境变量GOPATH的值决定了这个顺序.如果你在GOPATH中设置了多个工作区,那么这种查找会以从左到右的顺序在这些工作区中进行. 你可以通过试验来确定这个问题的答案.例如:先在一个源码文件中导入一个在你的机器上并不存在的代码包,然后编译这个代码文件.最后,将输出的编译错误信息与GOPATH的值进行对比. 如果在多个工作区中都存在导入路径相同的代码包会产生冲突吗? 答:不会产生…
03 | 库源码文件 在我的定义中,库源码文件是不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他代码使用(只要遵从 Go 语言规范的话). 这里的"其他代码"可以与被使用的程序实体在同一个源码文件内,也可以在其他源码文件,甚至其他代码包中. 那么程序实体是什么呢?在 Go 语言中,程序实体是变量.常量.函数.结构体和接口的统称.我们总是会先声明(或者说定义)程序实体,然后再去使用. 比如在上一篇的例子中,我们先定义了变量name,然后在main函数中调用fmt.P…
目录 开篇词 | 跟着学,你也能成为Go语言高手 导读 | 写给0基础入门的Go语言学习者 导读 | 学习专栏的正确姿势 开篇词 | 跟着学,你也能成为Go语言高手 Go 语言是由 Google 出品的一门通用型计算机编程语言. Go 程序可以在装有 Windows.Linux.FreeBSD 等操作系统的服务器上运行,并用于提供基础软件支撑.API 服务.Web 服务.网页服务等等. Go 语言也在移动端进行了积极的探索,现在在 Android 和 iOS 上都可以运行其程序.另外,Go 语言…
14 | 接口类型的合理运用 前导内容:正确使用接口的基础知识 在 Go 语言的语境中,当我们在谈论"接口"的时候,一定指的是接口类型.因为接口类型与其他数据类型不同,它是没法被实例化的. 更具体地说,我们既不能通过调用new函数或make函数创建出一个接口类型的值,也无法用字面量来表示一个接口类型的值. 对于某一个接口类型来说,如果没有任何数据类型可以作为它的实现,那么该接口的值就不可能存在. 我已经在前面展示过,通过关键字type和interface,我们可以声明出接口类型. 接口…
23 | 测试的基本规则和流程 (上) 在接下来的日子里,我将带你去学习在 Go 语言编程进阶的道路上,必须掌握的附加知识,比如:Go 程序测试.程序监测,以及 Go 语言标准库中各种常用代码包的正确用法. 从上个世纪到今日今时,程序员们,尤其是国内的程序员们,都对编写程序乐此不疲,甚至废寝忘食(比如我自己就是一个例子). 因为这是我们普通人训练自我.改变生活.甚至改变世界的一种特有的途径.不过,同样是程序,我们却往往对编写用于测试的程序敬而远之.这是为什么呢? 我个人感觉,从人的本性来讲,我们…
46 | 访问网络服务 前导内容:socket 与 IPC 人们常常会使用 Go 语言去编写网络程序(当然了,这方面也是 Go 语言最为擅长的事情).说到网络编程,我们就不得不提及 socket. socket,常被翻译为套接字,它应该算是网络编程世界中最为核心的知识之一了.关于 socket,我们可以讨论的东西太多了,因此,我在这里只围绕着 Go 语言向你介绍一些关于它的基础知识. 所谓 socket,是一种 IPC 方法.IPC 是 Inter-Process Communication 的…
10 | 通道的基本操作 作为 Go 语言最有特色的数据类型,通道(channel)完全可以与 goroutine(也可称为 go 程)并驾齐驱,共同代表 Go 语言独有的并发编程模式和编程哲学. Don't communicate by sharing memory; share memory by communicating. (不要通过共享内存来通信,而应该通过通信来共享内存.) 这是作为 Go 语言的主要创造者之一的 Rob Pike 的至理名言,这也充分体现了 Go 语言最重要的编程理…
13 | 结构体及其方法的使用法门 我们都知道,结构体类型表示的是实实在在的数据结构.一个结构体类型可以包含若干个字段,每个字段通常都需要有确切的名字和类型. 前导内容:结构体类型基础知识 当然了,结构体类型也可以不包含任何字段,这样并不是没有意义的,因为我们还可以为类型关联上一些方法,这里你可以把方法看做是函数的特殊版本. 函数是独立的程序实体.我们可以声明有名字的函数,也可以声明没名字的函数,还可以把它们当做普通的值传来传去.我们能把具有相同签名的函数抽象成独立的函数类型,以作为一组输入.输…
15 | 关于指针的有限操作 在前面的文章中,我们已经提到过很多次"指针"了,你应该已经比较熟悉了.不过,我们那时大多指的是指针类型及其对应的指针值,今天我们讲的则是更为深入的内容. 让我们先来复习一下. type Dog struct { name string } func (dog *Dog) SetName(name string) { dog.name = name } 对于基本类型Dog来说,*Dog就是它的指针类型.而对于一个Dog类型,值不为nil的变量dog,取址表达…
17 | go语句及其执行规则(下) 知识扩展 问题 1:怎样才能让主 goroutine 等待其他 goroutine? 我刚才说过,一旦主 goroutine 中的代码执行完毕,当前的 Go 程序就会结束运行,无论其他的 goroutine 是否已经在运行了.那么,怎样才能做到等其他的 goroutine 运行完毕之后,再让主 goroutine 结束运行呢? 其实有很多办法可以做到这一点.其中,最简单粗暴的办法就是让主 goroutine"小睡"一会儿. for i := 0;…