<<go语言实战>>读书笔记

编译器查找包的时候,总是会到GOROOT和GOPATH环境变量引用的位置去查找。


在Go语言里,标识符要么从包里公开,要么不从包里公开。从包里公开需要以大写字母开头,不从包里公开以小写字母开头。


map变量默认的零值是nil。


在Go语言中,所有变量都初始化为其零值。


对于数值类型,零值是0。


对于字符串类型,零值是空字符串。


对于布尔类型,零值是false。


对于指针,零值是nil。


log.Fatal()会在终端窗口输出错误,并且终止程序。


通道内置同步机制,从而保证通信安全。


在Go语言中,如果main函数返回,整个程序也就终止了。Go程序终止时,还会关闭所有之前启动且还在运行的goroutine。


写并发程序的时候,最佳做法是,在main函数返回前,清理并终止所有之前启动的goroutine。


关键字range可以用于迭代数组、字符串、切片、映射和通道。


在Go语言中,所有的变量都以值的方式传递。因为指针变量的值是所指向的内存地址,在函数间传递指针变量,是在传递这个地址值,


所以依旧被看做以值的方式在传递。


err = json.NewDecoder(file).Decode(&feeds) 与json.Unmarshal(file,&feeds)


如果接口类型只包含一个方法,那么这个类型的名字以er结尾。


空结构体(struct{})在创建实例时,不会分配任何内存。这种结构很适合创建没有任何状态的类型。


如果声明函数的时候带有接收者,则意味着声明了一个方法。这个方法会和指定的接收者的类型绑在一起(这个很重要)。




***(非常重要)


与直接通过值或者指针调用方法不同,如果通过接口类型的值调用方法,规则有很大的不同。使用指针作为接收者声明的方法,


只能在接口类型的值是一个指针的时候被调用,使用值作为接收者声明的方法,在接口类型的值为值或指针时,都可以调用。


关于chan很重要的一点:


for result:=range results{

}


这里不管results是带缓冲还是不带缓冲,通道会一直被阻塞,知道有结果写入,


一旦通道被关闭,for循环就会终止。


程序里所有的init方法都会在main函数启动前被调用。每个包可以包含任意多个init函数,这些函数都会在程序执行开始的时候被调用,


所有被编译器发现的init函数都会被安排在main函数之前执行。


程序编译时,会使用声明main包的代码所在的目录的目录名作为二进制可执行文件的文件名。


package main 和func main(){}是生成可执行文件的基础,缺一不可。


命名导入是指,在import语句给出的包路径的左侧定义一个名字,将导入的包命名为新名字。


执行go clean命令会删除编译生成的可执行文件。


go vet #可以捕获一部分常见错误。


go doc 你需要的内容  #这个命令可以在命令行下看文档的内容


godoc -http=:6060  #这个命令可以在本机上启动一个web服务器,打开浏览器,输入http://localhost:6060就可以查阅文档。


依赖管理工具流行有三:


1、godep


在项目的根目录下创建一个Godeps目录,由godep管理的依赖的源代码都放在Godeps/_workspace/src的目录里。


2、vender


3、gopkg.in  #可以帮助开发人员发布自己的包的多个版本


切片由指向底层数组的指针、长度和容器组成。(切记,一定要从这三个部分来考虑)


进行切片运算时,也就是newSlice:=slice[index:end]时,newSlice的cap肯定是等于


cap(newSlice)=cap(slice)-index


len(newSlice)=end-index


切片只能访问到其长度内的元素。要访问到len~cap之间的元素,必须先用append合并进来。


函数append总是会增加新切片的长度,而容量有可能会改变,也可能不会改变,这取决于被


操作的切片的可用容量。


在切片的容量小于1000个元素时,总是会成倍地增加容量,一旦元素个数超过1000,容量的增长因子会设为1.25,


也就是会每次增加25%的容量,随着语言的演变,这种增长算法可能会有所改变。


一个短变量声明操作符在一次操作中完成两件事情:声明一个变量,并初始化。(这两件事情必须都做才能用,只做一件则不能用)


两种不同类型的值即使互相兼容,也不能互相赋值,编译器不会对不同类型的值做隐式转换---必须使用显式转换


值接收者使用值的副本来调用方法,而指针接收者使用实际值来调用方法。


Go语言里的引用类型有如下几个:切片、映射、通道、接口和函数类型。


接口值由一个指向内部表(iTable)的指针和一个指向所存储值的指针两部分组成(必须考虑这两部分)。


内部表包含了所存储的值的类型信息和方法集合。


如果使用指针接收者来实现一个接口,那么只有指向那个类型的指针才能够实现对应的接口。如果使用值


接收者来实现一个接口,那么那个类型的值和指针都能够实现对一个的接口。


因为不是总能获取一个值的地址(不能取址),所以值的方法集只包含了使用值接受者实现的方法。


即使只有一个逻辑处理器,Go也可以以神奇的效率和性能,并发调度无数个goroutine。


缓冲通道---只有在通道中没有要接收的值时,接收动作才会阻塞。只有在通道没有可用缓冲区容纳被发送的值时,发送动作才会阻塞。


当通道关闭后,goroutine依旧可以从通道接收数据,但是不能在向通道里发送数据。能够从已经关闭的通道接收数据这一点非常重要,


因为这允许通道关闭后已经能取出其中缓冲的全部值,而不会有数据丢失。从一个已经关闭且没有数据的通道里获取数据,总会立刻返回,


并返回一个通道类型的零值。


dest:=io.MultiWriter(os.Stdout,file) //使用MultiWriter,这样就可以同时向文件和标准输出设置进行写操作
io.Copy(dest,r.Body)//读出响应的内容,并写到两个目的地。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值