安装Go语言及搭建Go语言开发环境
下载地址:
Go官网下载地址:https://golang.org/dl/
Go官方镜像站(推荐):https://golang.google.cn/dl/
版本的选择
Windows平台和Mac平台推荐下载可执行文件版,Linux平台下载压缩文件版。
安装
windows
安装
linux
安装
// 下载
wget https://dl.google.com/go/go1.11.5.linux-amd64.tar.gz
将下载好的文件解压到/usr/local
目录下:
mkdir -p /usr/local/go # 创建目录
tar -C /usr/lcoal/go zxvf go1.11.5.linux-amd64.tar.gz. # 解压
如果提示没有权限,加上sudo
以root用户的身份再运行。执行完就可以在/usr/local/
下看到go目录了。
配置环境变量: Linux下有两个文件可以配置环境变量,其中/etc/profile
是对所有用户生效的;
$HOME/.profile
是对当前用户生效的,根据自己的情况自行选择一个文件打开,添加如下两行代码,保存退出。
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
修改/etc/profile
后要重启生效,修改$HOME/.profile
后使用source命令加载$HOME/.profile
文件即可生
效。
检查:
~ go version
go version go1.11.5 linux/amd64
可以打开终端窗口,输入go version
命令,查看安装的Go版本。
配置GOPATH
GOPATH
是一个环境变量,用来表明你写的go项目的存放路径(工作目录)。
GOPATH
路径最好只设置一个,所有的项目代码都放到GOPATH
的src
目录下。
补充说明:Go1.11版本之后,开启go mod
模式之后就不再强制需要配置GOPATH
了。
Linux和Mac平台就参照上面配置环境变量的方式将自己的工作目录添加到环境变量中即可。 Windows平台按下面的步骤将D:codego
添加到环境变量:
在 Go 1.8 版本之前,GOPATH
环境变量默认是空的。从 Go 1.8 版本开始,Go 开发包在安装完成后会为 GOPATH
设置一个默认目录,参见下表。
GOPATH在不同操作系统平台上的默认值
平台 | GOPATH默认值 | 举例 |
---|---|---|
Windows | %USERPROFILE%/go | C:Users用户名go |
Unix | $HOME/go | /home/用户名/go |
同时,我们将 GOROOT
下的bin目录及GOPATH
下的bin目录都添加到环境变量中。
配置环境变量之后需要重启终端(cmd、VS Code里面的终端和其他编辑器的终端)。
Go项目结构
在进行Go语言开发的时候,我们的代码总是会保存在$GOPATH/src
目录下
在工程经过go build
、go install
或go get
等指令后,会将下载的第三方包源代码文件放在$GOPATH/src
目录下
产生的二进制可执行文件放在 $GOPATH/bin
目录下,生成的中间缓存文件会被保存在 $GOPATH/pkg
下。
如果我们使用版本管理工具(Version Control System,VCS。常用如Git)来管理我们的项目代码时,我们只需要
添加$GOPATH/src
目录的源代码即可。bin
和 pkg
目录的内容无需版本控制。
适合个人开发者
们知道源代码都是存放在GOPATH
的src
目录下,那我们可以按照下图来组织我们的代码
目前流行的项目结构
Go语言中也是通过包来组织代码文件,我们可以引用别人的包也可以发布自己的包,但是为了防止不同包的项目名冲突,我们通常使用顶级域名
来作为包名的前缀,这样就不担心项目名冲突的问题了。
因为不是每个个人开发者都拥有自己的顶级域名,所以目前流行的方式是使用个人的github用户名来区分不同的包。
适合企业开发者
Go开发编辑器
Go采用的是UTF-8编码的文本文件存放源代码,理论上使用任何一款文本编辑器都可以做Go语言开发,这里推荐
使用VS Code
和Goland
。 VS Code
是微软开源的编辑器,而Goland
是jetbrains出品的付费IDE。
我们这里使用VS Code
加插件做为go语言的开发工具。
GO语言介绍及其其他补充
静态与动态
-静态:(类型在程序运行过程中不允许改变)类型固定 a=10
-动态:(类型在程序运行过程中允许改变) 类型固定 a=10 a="qqq" (python)
强类型与弱类型
-强类型:(go,python是强类型)强类型 ,不通类型之间不允许直接运算 10+"ttt"
-弱类型:js 不通类型之间可以直接运算 10+"ttt"
解释型与编译型
-编译型:先编译再执行 编译成可执行文件--可执行文件执行
-c 编译成dll(动态链接库),就是可执行文件
-解释型:(解释型:js,php,python)
-解释型语言,代码要运行在解释器之上
-java:解释型还是编译型?有个编译过程,并不是编译成可执行文件,.class文件,不能直接运行在操作系统之上,它需要运行在jvm(java虚拟机之上,就可以当做解释器)
-不论在什么平台执行java程序,最少需要装java虚拟机, 一处编码,处处运行(跨平台)
跨平台编译
-跨平台编译 (可以跨平台编译:在不通平台可以编译出另一个平台的可执行文件)
c/c++ :不通平台的软件,需要现场编译成可执行文件
python :需要安装解释器(不通平台)
java :不通平台需要装java虚拟机
go :只要编译完了,直接拿着执行就可以了(不通平台编译不通平台的可执行文件)
垃圾回收机制
有垃圾回收机制的: python,go,java (gc),c没有垃圾回收,变量定义了,不使用了,自己释放掉
补充
ps补充: 支持面向对象和面向过程(go不是一门纯粹的面向对象语言,没有类的概念,但是可以实现面向对象的特
性:继承封装多态)
ps补充: go 1.5以后自己实现自己 --也是由 c写起来的 之后就是自己的代码写的了的)
谁在用?
-google:k8s(容器编排),都是go写的
-docker:(不是谷歌公司的),用go写的
-腾讯蓝鲸
-手机百度 后端大量的go
-区块链:用go写(可以用任何语言写,第一款开源的区块链项目,用go写的)
第一个Go程序
Hello World
现在我们来创建第一个Go项目——hello
。在我们的GOPATH
下的src目录中创建hello目录。
在该目录中创建一个main.go
文件:
package main // 必须指明是哪个包 main包
//表示导入fmt包,对比python即可
import "fmt"
func main() { //定义了一个main函数
fmt.Println("hello world") //打印出helloworld
}
//go代码跟格式缩进没关系,你的代码需要格式化,好看
//1 以后再写go代码,必须把代码放在 main包下的main函数中(go程序的入口,是main包下的main函数)
//2 fmt.Println("hello world") 你看到的a... 其实是goland给你提示的,函数的形参是a...
//3 go语言中,包导入必须使用,否则报错,注释掉,包自动删除(goland做的,其他编辑器 没有)
go中的注释
//go当中的注释(跟js一样,java) 单行注释
// goland快捷键:ctrl+/ 快速单行注释,解开注释
/* 多行注释 */
go代码的执行
//执行go代码
1 goland上点击右键 Run 就可以执行(仅限于goland,vs code其他编辑器,都没有)
2 先编译,再执行正统的用法(go是编译型语言),用命令
编译:go build s1.go 编译,编译成当前平台的可执行文件 s1.exe
执行:s1.exe
3 编译并执行(在vs code上的命令窗口下执行go文件)
go run s1.go 相当于2中的所有步骤,不产生可执行文件 s1.exe不产生
变量
变量定义:定义方式三种,其他的都是变形
func main(){
//1 第一种:全定义
//var(关键字) 变量名 变量类型 = 变量值
var name string = "long"
fmt.Println(name)
}
func main(){
//2 第二种:类型推导(自动推导出变量类型)
var name = "long"
fmt.Println(name)
}
fmt.Printf("%T",a) //查看a的类型
func main(){
//3 第三种:简略声明(这个用的多) 冒号跟等号是一起的
a := 10
fmt.Println(a)
}
变形定义
// 只定义变量,不赋值
var a int //int类型空值,是0
声明多个变量,三种方式都可以
var a,b,c int=10,11,12
var a,b,c=10,11,12
var a,b,c=10,11,"xxx"
a,b,c:=11,12,"xxx"
变量不能重复定义
var a int
var a=90 //重复定义
a :=90 //重复定义
a=90
特殊情况
var a int
var a,b=10,20 // 不允许
1 变量定义了必须使用,否则报错(只有go要求这样)
2 查看变量没写
3 变量要先定义再使用
4 变量类型是固定的,不允许中途改变(静态语言)
5 如果只是定义变量,必须指定类型,只能用第一种定义方式(var a int)
6 变量不允许重复定义
以后所有类型的变量定义,就参照变量定义的三种方式 (a :=90)
变量类型
类型: 数字,字符串,布尔
数字:
-int:整数类型(包括负数) int,int8,int16,int32,int64
-int8:表示能存储的长度 8个比特位,8个小格,一个格只能放0和1,能表示的范围是:正的2的七次方-1到, 负的2的7次方-1
-int16,32...类推
-int:在32位机器上,表示int32,在64位机器上表示int64
-python中int类型,远远比go的int64大,大很多,python中一切皆对象,int int对象
-uint:正整数 uint,uint8,uint16,uint32,uint64
-uint8:范围:正2的8次方减一,有个0
-float:小数 float32,float64
-complex:复数(高等数学学得,实部和虚部,了解) complex32,complex64
-byte:uint8的别名,byte:翻译过来是字节,一个字节是多少,8个比特位,uint8就占8个比特位
-rune:int32的别名,4个字节,表示一个字符
字符串:
-string:
用双引号表示的(单引号表示的不是字符串)
var a string="my name is lqz"
反引号,就是python中的三引号,可以换行
var a string = `我很帅`
布尔:
-bool:true,false(都是小写)
var a bool=true
var a =false
a:=false
常量
package main
import "fmt"
//常量:恒定不变的量,只赋值一次,以后再也不能改了,数据库连接地址,端口号
//const关键字 变量名 变量类型 = 值
const name string= "lqz"
//类型推导
const name = "lqz"
//简略声明 不可以
//同时定义多个常量
const name,age ="lqz",19
func main() {
//name="long" //不允许修改
fmt.Println(name)
}