GO开发环境搭建
下载安装包
https://storage.googleapis.com/golang/go1.7.darwin-amd64.pkg
配置环境变量
touch ~/.bash_profile #生成这个user的环境变量
open -e ~/.bash_profile #用编辑器打开这个文件
#添加环境变量 usr/local/go/bin 到这个文件中
export GOROOT=/usr/local/Go
export GOPATH=/Users/huang/Desktop/Go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN:$GOROOT/bin:
source ~/.bash_profile #编译这个文件 使环境变量生效
安装GO开发环境的LiteIDE
http://golangtc.com/download/liteide
给LiteIDE安装gdb
在解析字符串时,出现崩溃,给LiteIDE 安装gdb 来,调试程序,可以单步执行,并显示内存变量数值,用brew install gdb 安装新的gdb 后,需要对gdb进行签名,生成证书之后
codesign -s gdb-cert /usr/local/Cellar/gdb/7.7/bin/gdb
签名好后,测试还是不行 ,gdb 提示错误; During startup program terminated with signal ?, Unknown signal 原因为 经历了Xcode 编译器代码被注入的事件后,这次Mac OS X EI Captain系统的升级,启用了更高的安全性保护机制,系统完整性保护System Intergrity Protection (SIP)。简单来讲就是更加强制性的保护系统相关文件夹。 关闭这个服务的办法就重启电脑,安装 command R 进入恢复模式,在终端输入 csrutil enable 。就可以了。现在LiteIDE 终于可以用gdb调试代码。
GO语言的优势
GO语言优势 在于 天生高并发,利用的也是CSP并发模型。有P、M、G 三个概念。 P是Processor 调度者:每个P都有自己的协程队列,来及时调度协程充分对接内核线程。 由此 P的数量可以go的控制并发数。 G是Goroutine 协程:业务层任务的最小执行单元。 M是Machine 内核线程:直接操作CPU执行任务。
用自己的话说:
内核线程和用户空间的现场有长期稳定的关系,避免了总要切换。这个切换拿到了用户空间去做的 M是执行G的机器线程,跟P绑定才可以执行,P存放G的队列。看到这里大家会问到刚刚不是说多线程切换上下文开销很大吗?其实每个M都有一个g0栈内存,用来执行运行时管理命令。调度时候M的g0会从每个G栈取出栈(现场),调度之后再保存到G,这样不同的M就可以接着调度了。所有上下文都是自己在切换,省去了内核带来的开销,而且Golang会观察,长时间不调度的G会被其他G抢占(抢占调度其实就是一个标记)。
进程线程协程各自的作用:
进程调度可以很好的控制资源分配,线程调度让进程内部不因某个操作阻塞而整体阻塞。协程则是在用户态来优化程序,让程序员以写同步代码的方式写出异步代码般的效率。总结一下就是IO密集型一般使用多线程或者多进程,CPU密集型一般使用多进程,强调非阻塞异步并发的一般都是使用协程,当然有时候也是需要多进程线程池结合的,或者是其他组合方式。 http://www.kryptosx.info/archives/1363.html
解释执行语言 和编译执行语言 ? 解释执行语言:比如GO ,Java ,生成的是源码文件包,载入到到机器中,有专门的解释器/虚拟机,执行一条语句 解释一条语句 将命令导入内存。效率一般 ,不如编译执行的语言 直接生成可执行二进制文件。解释执行语言比较适合小型机,
GO语法
在go语言中make专门为map,slice 和channel来初始化。与new的区别是 new返回的时候 已经初始化好的实例的地址(也就是个指针),而make 返回的是 一个实例(其实是实例的引用,跟实例一样)func new(Type) *Type ; func make(Type,size IntegerType ) Type ;
Go的好处:没有类 只有结构体类型。那么如何实现类的一些优势:
我们总结一下前面看到的:Go 没有类,而是松耦合的类型、方法对接口的实现。
OO 语言最重要的三个方面分别是:封装,继承和多态,在 Go 中它们是怎样表现的呢?
-
封装(数据隐藏):和别的 OO 语言有 4 个或更多的访问层次相比,Go 把它简化为了 2 层,类型只拥有自己所在包中定义的方法。
-
- 包范围内的:通过标识符首字母小写,对象 只在它所在的包内可见
-
- 可导出的:通过标识符首字母大写,对象 对所在包以外也可见
- 继承:用组合实现:内嵌一个(或多个)包含想要的行为(字段和方法)的类型;多重继承可以通过内嵌多个类型实现
- 多态:用接口实现:某个类型的实例可以赋给它所实现的任意接口类型的变量。类型和接口是松耦合的,并且多重继承可以通过实现多个接口实现。Go 接口不是 Java 和 C# 接口的变体,而且:接口间是不相关的,并且是大规模编程和可适应的演进型设计的关键。
Go语言强调组合比继承更灵活:通过内嵌匿名结构体 来实现类的继承。 Go语言强调高内聚低耦合:类型的数据定义和方法行为可以不写在一起。 遗留问题:程序的编译与装载 -> 编译执行和解释执行的原理 -> Go 语言协程的高效原因-> ≈是一个线程 ? (腾讯,美团,微信小程序的原理)
Go语言的依赖管理
godep 使用 :
godep save 在根目录即检测并生成项目依赖,然后就可以删掉原来的目录了。
godep update 当依赖有变化时 更新即可。
以后就不能使用go run 了 而是 godep go ,因为 go run 是先从GOPATH里找包,godep go 是在项目的环境变量加上了 他自己生成的workspace。
database/spl 数据库的使用:
db, err = sql.Open(“sqlite3”,”todo.sqlite3")
db.Close()
rows, err = db.Query(“")
写好了自己的app程序代码之后 go install安装在GOPATH里面,在主工程里就可以用github.com/callmebill/todolist/app.里面的代码了。这样可以将自己的业务代码分离开。
GO语言的测试
golang 的测试覆盖率
go test -cover -coverprofile myapp.out
go tool cover -html=myapp.out -o myapp.html