一. 为什么需要引入Go语言?
Go语言——让你用写Python代码的开发效率编写C语言代码。
Go于2009年发布,当时多核处理器已经上市。Go语言在多核并发上拥有原生的设计优势,Go语言从底层原生支持并发,无须第三方库、开发者的编程技巧和开发经验。
二. 开发环境的配置:
自行百度,重点是GOPATH和GOROOT和环境变量的配置。
go module
go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。
启用go module支持首先要设置环境变量GO111MODULE,通过它可以开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是auto。
1. GO111MODULE = off 禁用模块支持,编译时会从GOPATH和vendor文件夹中查找包。
2. GO111MODULE = on 启用模块支持,编译时会忽略GOPATH和vendor文件夹,只根据 go.mod下载依赖。
3. GO111MODULE = auto,当项目在$GOPATH/src外且项目根目录有go.mod文件时,开启模块支持。
**例如:**在vscode中安装go插件后,会提示下载常用工具,经常会出错这个时候要使用代理来解决–>https://goproxy.io 这个网站有对应的镜像,按照网站说明做就可以了;
在我的电脑中配置的环境变量如下:
常用的go mod命令如下:
go mod download //下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit //编辑go.mod文件
go mod graph //打印模块依赖图
go mod init //初始化当前文件夹, 创建go.mod文件
go mod tidy //增加缺少的module,删除无用的module
go mod vendor //将依赖复制到vendor下
go mod verify //校验依赖
go mod why //解释为什么需要依赖
: go.mod 文件记录了项目所有的依赖信息,使用go mod 管理项目,就不需要非得把项目放到GOPATH指定目录下,你可以在你磁盘的任何位置新建一个项目。包含go.mod文件的目录也被称为模块根,也就是说,go.mod 文件的出现定义了它所在的目录为一个模块。
: 在国内访问golang.org/x的各个包都需要翻墙,你可以在go.mod中使用replace替换成github上对应的库。或者使用go get命令直接下载相关工具和依赖包。
go get命令如下:
go get -u //将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
go get -u=patch //将会升级到最新的修订版本
go get package@version //将会升级到指定的版本号version
-
在项目中使用go module进行管理:
1)既有项目:- 在项目目录下执行go mod init,生成一个go.mod文件。
- 执行go get,查找并记录当前项目的依赖,同时生成一个go.sum记录每个依赖库的版本和哈希值。
2)新项目:
- 执行go mod init 项目名命令,在当前项目文件夹下创建一个go.mod文件。
- 手动编辑go.mod中的require依赖项或执行go get自动发现、维护依赖。
三. Go语言基础
0.变量和常量:
/*变量*/
//标准声明变量:
var 变量名 变量类型
如:var name string
var age int
var isOk bool
//批量声明变量:
var (
a string
b int
c bool
d float32
)
//变量的初始化:
var 变量名 类型 = 表达式//有时候直接将变量类型省略,如:var name = "Q1mi"
var name string = "Q1mi"
var age int = 18
或者一次初始多个变量:
var name, age = "Q1mi", 20
//短变量声明:(在函数内部)
直接使用:= 方式声明并初始化变量。如:
n := 10
//匿名变量:
使用多重赋值时,如果想要忽略某个值,可以使用匿名变量,用下划线 _ 表示,如:
func foo() (int, string) {
return 10, "Q1mi"
}
x, _ := foo() //匿名变量不占用命名空间,不会分配内存
_, y := foo()
/*常量*/
const pi = 3.1415
const e = 2.7182
或者:
const (
pi = 3.1415
e = 2.7182
)
//into时go语言的常量计数器,只在常量的表达式中使用;
const (
n1 = iota //0 iota可理解为const语句块中的行索引
n2 //1
n3 //2
n4 //3
)
1. 基本数据类型
整形:uint8 uint16 uint32 uint64 int8 ……
特殊的整形:uint/int 32和64位OS上分别是32位和64位
浮点型:float32 和 float64
复数:complex64 和 complex128
布尔值:bool 只有true和false两个值
字符串:直接用“”,s1 := "hello"
定义多行字符串时:s1 := `第一行
第二行
第三行
` //反引号进行引用
字符串常用操作:
len(str) 求长度
+或fmt.Sprintf 拼接字符串
strings.Split 分割
strings.contains 判断是否包含
strings.HasPrefix,strings.HasSuffix 前缀/后缀判断
strings.Index(),strings.LastIndex() 子串出现的位置
strings.Join(a[]string, sep string) join操作
byte和rune类型:
1、uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。
2、rune类型,代表一个 UTF-8字符。即中文字符
s1 := "big"
byteS1 := []byte(s1) //Go语言中只有强制类型转换,且只有转换成rune/byte类型时才可以修改字符串。
s2 := "白萝卜"
runeS2 := []rune(s2)
以后还会更新Go语言的基础知识(运算符、流程控制、数组切片map等类型、函数、闭包、指针、结构体等)及更高阶的知识!!!
之后将继续更新本人Go语言的学习之路,这是我在学习过程中的笔记,也希望各位能提出自己珍贵的建议,请大家继续关注啦!