特点
- 静态类型(可以声明类型,也可以自动推断),编译型(可编译为二进制文件)的开源语言(open source)。
- 脚本化的语法,支持多种编程范式。(函数式&面向对象)。
- 原生给力的并发编程支持。(go语言语法中就有方法支持把代码片段并发提交给cpu执行)
优劣
- 脚本化语法方便编写程序,对新手友好。
- 静态类型+编译型使得程序运行速度有保障。
- 原生支持并发编程。
- 劣势
- 语法糖并没有python,ruby那么多。
- 目前的程序运行速度不及c。
- 第三方函数库暂时不像绝对主流的编程语言那样丰富。
linux 安装与配置
- 去go官方网站下载相应版本的安装包,注意操作系统和计算架构(32bit or 64bit)。
- 将文件拷贝到服务器,我下载的为 go1.13.5.linux-amd64.tar.gz
- 进入到文件夹,tar -zxf go1.13.5.linux-amd64.tar.gz -C /usr/local
- 进入到/usr/local/go 键入 bin/go 会打印出go的版本信息
- 设置需要了解4个环境变量:GOROOT,GOPATH,GOBIN,PATH,需要设置到某一个profile文件中(~/.bash_profile||/etc/profile)
- 配置环境变量,在5的两个文件中任意一个添加
#go setting export GOROOT=/usr/local/go export GOPATH=~/golib:~/goproject export GOBIN=~/gobin export PATH=$PATH:$GOROOT/bin:$GOBIN
然后执行配置文件,使配置生效即可
-
然后就可以在任意目录结构下面使用go了 -_-
基本规则
- 工作区与GOPATH
- 工作区是放置Go源码文件的目录一般情况下,Go源码文件都需要存放在工作区中,但是对于命令源码文件来说,不是必须的。每一个工作区的结构都类似下所示。
/home/hypermind/golib:
src/
pkg/
bin/
- 原文件的分类和含义
- go源码文件:名称以.go为后缀,内容以Go语言代码组织的文件,多个Go源码文件是需要用代码包组织起来的。
- 分三类:
命令源码文件:声明自己属于main代码包,包含无参数声明和结果声明的main函数,被安装后,相应的可执行文 件会被存放到GOBIN指向的目录或<当前工作区目录>/bin下面,命令源码文件是Go程序的入口, 但不建议把程序都写在一个文件中,统一代码包中强烈不建议直接包含多个命令源码文件 库源码文件:不具备命令源码文件的两个特征的源码文件,被安装后,相应的归档文件会被存放到<当前工作区目 录>/pkg/<平台相关目录>下 测试源码文件:不具备命令源码文件的两个特征的源码文件,名称以_test.go为后缀,其中至少有一个函数的名 称以Test或者Benchmark为前缀,该函数如果接受*testing.T参数则为功能测试函数,如果接受 一个*testting.B的指针参数则为基准测试函数(性能测试函数)。
-
代码包
1.作用:编译和归档Go程序的最基本单位,代码划分,集结和依赖的有效组织形式,也是权限控制的辅助手段。 2.规则:一个代码包实际上就是一个由导入路径代表的目录,导入路径即<工作区目录>/src或/pkg/<平台相关目 录>之下的某段子路径。 3.声明:每个源码文件必须声明其所属的代码包,同一个代码包中的所有源码文件声明的代码包应该是相同的。 4.代码包声明和导入路径的区别:代码包声明语句中的包名称应该是该代码包的导入路径的最右子路径,例如 代码包:hypermind.cn/pkgtool 源码文件声明包为 package pkgtool 小技巧:子代码包可以直接迁移 5.导入:代码包导入语句中使用的包名称应该与其导入路径一致,例如: flag import( fmt => "flag" strings "fmt" "strings" ) 代码包导入方法: 1.import str "strings" //起别名 2.import . "strings" //本地化导入 使用不需要使用前缀 3.import _ "strings" //仅仅执行代码包中的初始化函数 6.初始化:1.代码包初始化函数即:无参数声明和结果声明的init()函数 2.init()函数可以被声明在任何文件中,且可以有多个 3.init()函数执行的时机 *单一代码包内=>对所有全局变量进行求值=>执行所有init()函数,同一代码包中所有的init()函 数执行顺序是不确定的。 *不同代码代码包内=>执行被导入的代码包中的init()函数=>执行导入它的那个代码包的init()函 数,例如导入顺序为A->B->C,则执行顺序为C->B->A。同一级别的代码包init()函数无序, 比如A导入B和C,则在执行时无法确定B与C的init()函数谁先执行。 *所有涉及到的代码包,也就是他们的init()函数都在Go程序的main()函数之前执行,所有的 init()函数去重执行,也就是只会执行一次。
注:所有知识点均采用imooc.com郝林大佬的免费视频中,赠人玫瑰,手有余乡,感兴趣的小伙伴可以去看一下。