go
effective go 简洁,全
环境安装
brew install go
当前版本 1.11.0- 安装后用
go env
查看环境信息
- 安装后用
- 编辑环境:
- goland,搜索安装,需要付费或者破解;
- 或者vscode+go plugin 熟悉了后,这个也挺好用
godoc
1 | godoc -http=:6060 |
使用这个可以写出良好的代码+文档(注释文档是代码的一部分)
feature
- 编译为本地代码,运行较快;可选静态编译,把依赖都打入可运行程序,简单,并且能减少对系统环境依赖
- 简洁
- 无类(class)概念,替代的是较简洁的struct
- 代码格式要求严格;gofmt工具会被自动应用
- 语法上的简洁:贴近于最常用的基本功能
- 类型不能隐式转换(这不是优点,只是特色)
- 更强的switch语句
- 不支持泛型(非优点)
- 工具
go run src../main.go
go build -race src../main
go test -v
- 强制约定
- GOPATH及相关路径
- 大写字母开头的变量和函数是Public的
- 协程,小于线程,非系统资源,由框架调度,并且使用方便
- 函数first:参数,变量,返回值都可以是函数
- 但它不支持函数式编程(只能模拟,非友好支持)
- 不可变性,不能有状态,只有常量和函数
- 但它不支持函数式编程(只能模拟,非友好支持)
重要概念
- 数组
- 数组是值。将一个数组赋值给另一个,会拷贝所有的元素。
- 特别是,如果你给函数传递一个数组,其将收到一个数组的拷贝,而不是它的指针。
- 数组的大小是其类型的一部分。类型[10]int和[20]int是不同的。
- 切片(slice)对数组进行封装
- 切片持有对底层数组的引用,如果你将一个切片赋值给另一个,二者都将引用同一个数组。
- map持有对底层数据结构的引用。
- append内置函数所做的事情是将元素添加到切片的结尾,并返回结果。需要返回结果,是因为和我们手写的Append一样,底层的数组可能会改变
- Go中的常量仅仅就是—常量。它们是在编译时被创建
- 每个源文件可以定义自己的不带参数的(niladic)init函数。init是在程序包中所有变量声明都被初始化,以及所有被导入的程序包中的变量初始化之后才被调用。
需要深入理解的
- 传值还是传指针
- 同名package?
- main包的导入路径是无关紧要的
- *_test.go由go test命令独立编译
- 同名包使用别名来处理冲突
- 匿名导入包,使用占位符作为别名
- interface{}是空接口,任何对象都实现了空接口,所以 interface{}可以引用任何对象
- interface类型变量包含了两个指针,分别指向实际变量的值(value)和类型(对应concrete type)
编程风格
- 驼峰式命名
- 在所在范围内尽量简单
- 尽早return
- 尽可能有好的godoc
- 带mutex的struct必须是指针
- golang不推荐统一处理异常,要手动处理每一个返回的错误
chan
类似Java的同步队列。通过提供原子的通信原语,避免了竞态情形(race condition)下复杂的锁机制。
- 不带缓存
- 写入第二个会被阻塞
- 写入方关闭,读取方会返回0值
- 往已经关闭的chan写入,panic
- 从已经关闭的chan读取,0值
- 带缓存
- 写:直到缓冲区写满后,写才会阻塞
- 写:写入已经关闭的管道,panic
- 读:缓冲区读空,读端阻塞
- 读:读已经关闭的管道,不会阻塞,
- 如果还有值,那么返回缓存的值
- 如果没有值,那么立即返回0值
操作 | nil chan | closed chan | not-closed not-nil chan |
---|---|---|---|
close | panic | panic | succ |
写 ch<- | 一直阻塞 | panic | 阻塞或成功写入 |
读 <-ch | 一直阻塞 | 读取对应类型零值 | 阻塞或成功读取数据 |
1 | v, ok := <-ch |
正则
Go的框架
go的框架gin、beego、xorm等等
csp
简单常用
1 | type:main.Power |
工具
1.
lib/package
自带go list std
- fmt
- os:跨平台操作
- io
- io/ioutil
- math
- math/rand
- log
- bufio:处理数据的输入输出
- net
- net/http
- unicode/utf8
- image
- image/color
- image/gif
- path
- path/filepath
- encoding/json
- encoding/xml
1 |
常用三方
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com