Go半小时入坑
关于go的一些基础,也不是特别准确吧,不对请指出
关于环境
欲go必装go,go的安装,mac我觉得直接用brew命令很棒,也可以去官网下载
用go env
查一下自己的一些配置
圈出来的,最好在.bash_profile
下设置下吧
GOPATH这个主要是存放路径,路径下 bin存放编译后的可执行文件;pkg存放编译后的包文件;src存放项目源文件。
关于ide:如果是轻量级的食用,我觉得vscode就已经很棒了,idea装插件也很赞,我直接装的goland,也是jetbrains公司的,不免费(其实idea带插件就很不错),方法自寻,学术免费,还是建议食用IDE,毕竟刚刚开始使用,我觉得成型的IDE免去很多麻烦,后续看看这些IDE都做了什么,安装了什么包,配置了什么,对以后手动配置和理解也很有帮助,也可以迅速步入正题。goland基本上进去会自动识别出来上面三个路径吧,尤其是gopath。
Go的理解
Go语言的类型系统
Go使用组合设计模式;不同于java的继承,两者应该是这样的
继承:车(驾驶员) <-- 客车(乘客)<-- 货车(货物)
组合:货车(驾驶,载客,运货)
除了Go本身的基础类型,用户定义类型,基本上就是包含一组带类型的字段,用来存储数据;
Go的接口用于对行为建模,而不是对象,比如Java,定义了Users接口,必须要声明引用该接口还要实现接口的所有方法;比如用户login()/logout()/changepass()…
而Go呢,Go就是,如果你实现了上述的方法,那就默认你这个类属于Users,也就是,可以存储在这个接口类型的实例中;而不需要声明引用了该接口;
并且,Go的接口一般都倾向于设计为单一行为;下面就是Go的io.Reader接口
1 | type Reader interface{ |
Demo
1 | //package |
包概念
go就是包概念的东西,一个包一个包的组织
即使时自己构建的包,也是这样的。一般文件叫啥名字包名就是什么,但是main包是一个特殊包,是入口
import
引入包,比如格式化输出包"fmt",里面有一个特点就是,go的管理很严格,如果引入了包却不用是表示报错的,而不是warnning,如果只是需要引入,那就记得在前面加个下划线,表示不引入包内标识符,只是执行包内的"init"函数。
还有就是注意路径,这个安装和配置有关系,我在clone go-ethereum的源码的时候,一开始克隆在src目录下,看wiki发现错了:
1 | git clone git@github.com:nirname/go-ethereum.git $GOPATH/src/github.com/ethereum/go-ethereum |
就是说,是在src/github.com/ethereum下,这是因为内部代码的import用的是这个路径
函数
特殊的俩函数,init和main,init就相当于c++里面的析构函数吧,跑在所有函数前面,至少before main
变量
除了普通的一些常规变量,主要说,数组,切片,映射,用户自定义
变量定义有这么几个小特点
- 定义是反着写的,先写变量名,再写类型
- 大写的全部变量可以被包外直接访问,小写的不可以,有点像public和protected的区别,但是虽然不能直接访问,但是可以间接读取到
- 初始化并定义的符号":="
- 默认值为零值,可以是nil(go的null),可以是"",可以是0, 可以是false主要看是什么类型
- 切片是go一个非常特别的变量,不多说,可以认为是一种特殊的动态数组?
- 切片的拷贝和追加都是非常有趣的知识点
1 | //Array |
方法
1 | //self-define |
go的方法不是定义在类型中的,而是依靠"接收者"这个概念绑定的,也就是函数中那个"(u user)",表示这函数属于user吧
接口
待
单元测试
待
go模块
待
go命令
go build xxx.go
得到一个可执行文件。
go install
功能和 go build 类似,约等于『go build + 把编译后的可执行文件放到GOPATH/bin目录下』
附加参数绝大多数都可以与 go build 通用。
go install 只是将编译的中间文件放在 GOPATH 的 pkg 目录下,以及固定地将编译结果放在 GOPATH 的 bin 目录下。
总结 go install 的编译过程有如下规律:
- go install 是建立在 GOPATH 上的,无法在独立的目录里使用 go install。
- GOPATH 下的 bin 目录放置的是使用 go install 生成的可执行文件,可执行文件的名称来自于编译时的包名。
- go install 输出目录始终为 GOPATH 下的 bin 目录,无法使用
-o
附加参数进行自定义。 - GOPATH 下的 pkg 目录放置的是编译期间的中间文件。
go get
git clone + go install,如果碰到无法下载的问题,可能是因为,你懂的,找github替代包或者修改hosts