Go语言介绍与环境搭建与变量、常量、基本数据类型
Go语言介绍与环境搭建与变量、常量、基本数据类型
1. Go语言介绍
1、Google公司出的,诞生于 2009年,10年的时间,非常新的语言,天然支持并发,很新,生态不完善(轮子少 beego、gin)
-python:1989年
-java:1990年
-2005年,之前的语言,对并发支持不是特别好
2、Go是静态强类型语言,编译型语言:
- 强类型语言:不允许不同类型的数据进行运算
- 弱类型语言:允许不同类型数据进行运算
3、有垃圾回收机制
4、支持面向对象和面向过程的编程模式(go不是一个纯粹的面向对象语言,面向对象的特性它都有:继承,封装,多态)
5、2009年推出 12年稳点版本 1.5——实现的架构变化,同时保留了和旧版本的兼容性,以后的go,完全实现了go自己写的
2020年 1.14版本 ---》规划:go 2.0以后,会有大更新:支持泛型,异常处理
6、go语言为什么火:docker火,谷歌(k8s),区块链(第一款开源的区块链项目,用go写的),国内互联网公司爱用,性能高,语法简介,上手快,go特别适合服务端开发(微服务的开发)
2. go语言环境搭建
1. 安装环境
go开发包:https://golang.google.cn/dl/
IDE工具:golang(推荐使用),vscode,sublime text
golang:跟pycharm 90%相似,jetbrains公司,idea,用来开发java的,phpstorm,pycharm,goland
go安装完成后:
# go version 查看go的版本 # go env 查看go的环境变量 GO111MODULE= # 没有值或者off,表示没有开启go mode模式,用的就是gopath模式 GOROOT=c:\go # go开发包的安装路径,确认好是否对 GOPATH=C:\Users\Administrator\go # 代码存放路径,确认好是否对,以后你的go代码都放在这个文件夹下 # 在任意位置敲go,都有这个命令,需要把 c:\go\bin加入环境变量 # go mode模式:代码可以放在任意路径
GOROOT和GOPATH
GOROOT
和GOPATH
都是环境变量,其中GOROOT
是我们安装go开发包的路径,而从Go 1.8版本开始,Go开发包在安装完成后会为GOPATH
设置一个默认目录,并且在Go1.14及之后的版本中启用了Go Module模式之后,不一定非要将代码写到GOPATH目录下,所以也就不需要我们再自己配置GOPATH了,使用默认的即可。
GOPROXY 非常重要
Go1.14版本之后,都推荐使用go mod
模式来管理依赖环境了,也不再强制我们把代码必须写在GOPATH
下面的src目录了,你可以在你电脑的任意位置编写go代码。(网上有些教程适用于1.11版本之前。)
默认GoPROXY配置是:GOPROXY=https://proxy.golang.org,direct
,由于国内访问不到https://proxy.golang.org
,所以我们需要换一个PROXY,这里推荐使用https://goproxy.io
或https://goproxy.cn
。
可以执行下面的命令修改GOPROXY:
go env -w GOPROXY=https://goproxy.cn,direct
2. 新建项目
1. 没有使用go module模式,不管是使用golang还是其他的IDE工具新建项目如果没有开启GO111MODULE都需要将代码路径放在GOPATH路径下的src文件夹中(如果没有就手动创建)
gopath路径下会有三个文件夹:src(放代码的),pkg(编译过程产生中间的东西),bin(编译后的可执行文件)
2. 使用go module模式新建项目时,我们需要通过 go mod init 项目名
命令对项目进行初始化,该命令会在项目根目录下生成go.mod
文件。例如,我们使用hello
作为我们第一个Go项目的名称,执行如下命令。
go mod init hello
3. 执行代码
编译型语言都是先编译再执行(golang中直接右键run即可)
编译:go build xx.go --->编译成当前平台下的可执行文件,名字为xx.exe
执行:Mac下./xx Windows下直接在可执行文件的路径下:ww.exe
4. 常见命令
go build 编译
go install 安装,把编译好的可执行文件放到bin目录下
go fmt 代码格式化
go run xx.go
5. 注释
// go语言中的单行注释使用
/*
多行注释
多行注释
*/
ctrl+/ 可以快速注释,解注释(goland中)
6. 入口函数
package main //表示声明main包,每一个go代码的第一行必须写这个 import "fmt" //导入fmt包 类比python中import os os.path func main() { //声明main函数 函数体的内容,放到大括号中 //goland提示的a... 形参是a fmt.Println("hello world") //在控制台输出helloworld ---> print("hello world") fmt.Println("hello world") }
程序的入口就是main包下的main函数,编译型语言都有入口,一个go项目只能有一个main函数
3. 变量的定义和使用
go中的变量和python中的变量在内存中的存储是不一样的
python中一切皆对象,都是变量名 -> 内存地址 -> 变量值
go中是变量名 -> 变量值因此,go中定义的变量不能重复定义
用关键字:var
变量定义有三种方式,并且定义了的变量就必须要使用,如果不使用就会报错
注意:
1 变量定义了,必须使用,否则报错
2 包导入了,要使用,不使用就报错
3 先定义再使用
4 不能重复定义
5 类型固定
package main func main() { //1 方式一:基本定义 //var关键字 变量名 变量类型 =变量值 //var age int=18 //定义并赋值 //var age int //定义 //age=18 //赋值 //2 方式二:类型推导(不需要加类型了,并不代表没有类型,类型都是固定的) //var age =18 //var age //错误,变量定义时,就要固定类型 //age=18 //3 方式三:简略声明(冒号跟等号是一起的,推荐第三种) // age :=18 //age //更不对了 //age=18 //4 同时定义多个变量 //var age,a,b,c int=18,19,20,21 //var age,a,b,c =18,19,20,21 //age,a,b,c :=18,19,20,21 //变形(能看懂,表示在定义即可) //var ( // age=19 // name="lqz" // sex="男" //) //5 变量要先定义再使用 //a=19 //a:=10 //6 变量不能重复定义 //var a int=18 ////var a=19 ////a:=19 ////简略声明的小特殊(冒号前,至少有一个未定义的变量即可) //b,a:=17,18 // //fmt.Println(a,b) //7 变量类型是固定的 //var a int=18 //var a=18 //a:=18 //a=80 //a="xxx" //不可以 //fmt.Println(a) //Printf,%T表示类型 //fmt.Printf("age的类型是:%T,值是:%d\n", age, age) //fmt.Println(age) /* 注意: 1 变量定义了,必须使用,否则报错 2 包导入了,要使用,不使用就报错 3 先定义再使用 4 不能重复定义 5 类型固定 */ } /* 在python中一切皆对象,对象就是个地址是引用 */
4. 常量
常量:恒定不变的量,建议常量全用大写,go中常量定义后是不能改变的,python中只是约定俗成的
用关键字 const
并且常量定义了可以不使用,其他的和定义变量类似,但是不能用简略 :=
package main func main() { //1 const关键字 常量名 常量类型 =值
const key = "qwwqrew"
const port int = 6379
//2 常量可以定义了不使用 //const age int =99 //3 类型可以省略 //const age =99 //fmt.Printf("%T",age) //4 同时定义多个常量 //const ( // AGE=19 // NAME="lqz" // sex="男" //) //fmt.Println(AGE) // ////5 改变常量(不允许) //AGE=199 //fmt.Println(AGE) }
5. 基本数据类型
1. 数字类型
有符合整型:
int:在32位机器上是int32,在64位机器是int64 int8:8个bit,一个字节,正负2的7次方减1的范围 int16:正负2的15次方减1的范围 int32:正负2的31次方减1的范围 int16:正负2的63次方减1的范围
无符号整型(正整数):
unit8
unit16
uint32
uint64
浮点型:
float32
float64:精度64,更加精确
复数:
complex:实部与虚部
其他:
byte:uint8的别名
rune: int32的别名
2. 字符串类型
用双引号或者反引号表示,反引号可以换行,用双引号换行用 \n
如果双引号内如果有双引号,需要加 \ 转义
3. 布尔类型
true 和 false(小写)
//布尔类型 //var a bool =true //var a =true //a :=true //var b bool =false //fmt.Println(a) //fmt.Println(b)
4. 类型转换
因为go是强类型语言,所有不同类型之间不能做运算,需要做类型转换
浮点型转成整型是将小数点后数全部舍弃
func main() { //float转成int类型,小数点后直接弃用,不是四舍五入 var a int = 10 var b float32=9.99999 fmt.Println(a+int(b)) // 19 // int和int64不是一个类型 var c int64 = 20 fmt.Println(a+int(c)) }
跨平台执行文件,在一个平台编译后其他平台能直接使用
Windows中编写的go跨平台传到Linux中运行
1. 在xx.go所在的文件夹位置进入cmd执行以下命令:
set GOARCH=amd64 set GOOS=linux go build xx.go
会生成一个没有后缀的xx二进制文件,将该文件上传的Linux系统中某个文件夹下
2. 赋予权限
chmod 777 xx
3. 执行
./xx
即可运行成功不需要go的任何依赖