go get安装x/sys失败的解决
// $GOPATH这段地址请自行修改,下载到goroot和gopath对应位置即可,不同系统略有不同 |
go get命令安装golang.org比较慢的话,一般都可以在github.com找到对应的package,下载后放到对应的目录即可
go的环境变量设置
在/etc/profile最下面加入以下代码:
# 可自行改成你的目录 |
import
import _ 执行init函数,但不需要包所有函数
import . 解决循环依赖问题
&和*
&符号的意思是对变量取地址,如:变量a的地址是&a
符号的意思是对指针取值,和聽&聽可以互相抵消,同时注意,*&可以抵消掉,但&*是不可以抵消的
切片容量
容量当做成总长度减去左指针走过的元素值
一旦一个切片无法容纳更多的元素,Go语言就会想办法扩容。但它并不会改变原来的切片,而是会生成一个容量更大的切片,然后将把原有的元素和新元素一并拷贝到新切片中。在一般的情况下,你可以简单地认为新切片的容量(以下简称新容量)将会是原切片容量(以下简称原容量)的2倍。 |
大小写
在Go语言中,没有特别的关键字来声明一个方法、函数或者类型是否为公开的,Go语言提供的是以大小写的方式进行区分的,如果一个类型的名字是以大写开头,那么其他包就可以访问;如果以小写开头,其他包就不能访问。
go的并发
概念 | 说明 |
---|---|
进程 | 一个程序对应一个独立程序空间 |
线程 | 一个执行空间,一个进程可以有多个线程 |
逻辑处理器 | 执行创建的goroutine,绑定一个线程 |
调度器 | Go运行时中的,分配goroutine给不同的逻辑处理器 |
全局运行队列 | 所有刚创建的goroutine都会放到这里 |
本地运行队列 | 逻辑处理器的goroutine队列 |
并发的概念和并行不一样,并行指的是在不同的物理处理器上同时执行不同的代码片段,并行可以同时做很多事情,而并发是同时管理很多事情,因为操作系统和硬件的总资源比较少,所以并发的效果要比并行好的多,使用较少的资源做更多的事情,也是Go语言提倡的。
通道
h:=make(chan int) |
无缓冲的通道
无缓冲的通道指的是通道的大小为0,也就是说,这种类型的通道在接收前没有能力保存任何值,它要求发送goroutine和接收goroutine同时准备好,才可以完成发送和接收操作。
从上面无缓冲的通道定义来看,发送goroutine和接收gouroutine必须是同步的,同时准备后,如果没有同时准备好的话,先执行的操作就会阻塞等待,直到另一个相对应的操作准备好为止。这种无缓冲的通道我们也称之为同步通道。
func main() { |
有缓冲的通道
有缓冲通道,其实是一个队列,这个队列的最大容量就是我们使用make函数创建通道时,通过第二个参数指定的。
ch := make(chan int, 3)
这里创建容量为3的,有缓冲的通道。对于有缓冲的通道,向其发送操作就是向队列的尾部插入元素,接收操作则是从队列的头部删除元素,并返回这个刚刚删除的元素。
当队列满的时候,发送操作会阻塞;当队列空的时候,接受操作会阻塞。有缓冲的通道,不要求发送和接收操作时同步的,相反可以解耦发送和接收操作。
想知道通道的容量以及里面有几个元素数据怎么办?其实和map一样,使用cap和len函数就可以了。
cap(ch) |
cap函数返回通道的最大容量,len函数返回现在通道里有几个元素。
func mirroredQuery() string { |
单向通道
有时候,我们有一些特殊场景,比如限制一个通道只可以接收,但是不能发送;有时候限制一个通道只能发送,但是不能接收,这种通道我们称为单向通道。这个在生产者消费者很实用。
定义单向通道也很简单,只需要在定义的时候,带上<-即可。
var send chan<- int //只能发送 |