下载
官方下载地址:https://studygolang.com
// 查看是否安装成功
go version
// 查看环境变量
go env
配置国内镜像
// 设置国内镜像(适用于1.13及以上版本)
go env -w GOPROXY=https://goproxy.cn,direct
// 设置go module为on
go env -w GO111MODULE=on
// 安装goimports工具
go get golang.org/x/tools/cmd/goimports
说明:
- goimports是在go文件保存时,会自动格式化代码,自动导入/删除相关的包
依赖管理
依赖管理的三个阶段:GOPATH、GOVENDOR、go mod
GOPATH
-
默认在~/go(unix,linux),%USERPROFILE%\go(windows)
-
相当于一个全局的库,所有的项目代码、第三方库都放在下面
GOVENDOR
- 每个项目都有自己的vendor目录,用来存放第三方库
- 一般使用第三方的依赖管理工具来管理项目的vendor目录,例如:dep、golide…
go mod
用来取代GOPATH和GOVENDOR,在项目中使用go.mod文件来管理引入的包、版本等,引入的包存储在%GOPATH%/pkg/mod下面。
- 由go命令统一管理,用户不必关心目录结构
- 初始化:go mod init
- 增加依赖:go get…
- 更新依赖:go get[@version],go mod tidy
- 将历史项目(GOPATH…)迁移到go mod:go mod init, go build ./…
说明:
go语言不允许在同一个包下,存在多个main函数,既,一个包只允许存在一个main函数
程序结构
- 必须在源文件指明这个文件属于哪个包;package main 表示一个可独立执行的程序,每个Go程序都包含一个名为main的包
- 当标识符以一个大写字母开头时,表示其他包可用(public),以小写开头时,表示只能本包使用(protected)
基本变量类型
-
bool,string 布尔类型和字符串
-
(u)int,(u)int8,(u)int16,(u)int32,(u)int64,uintptr 整数(ptr表示指针)
-
byte,rune 字节类型和字符类型(go特有的)
-
float32,float64,complex64,complex128 浮点型和复数
可以使用括号+类型((int) xx),进行强制类型转换。
变量
- 声明格式: var name [type]
- 没有初始化时,默认零值:数值类型(0)、布尔类型(false)、字符串("")、其他(nil)
- 如果没有指定类型时,会根据值自动判断类型
- 省略var(只能在函数体中出现): v_name := value
- 全局变量允许只声明不使用,局部变量不允许,声明之后,必须使用
使用var关键字
// 示例
var a, b c bool
var s1, s2 string = "hello", "world"
// 可以放在函数内(局部变量),或者放在包内(全局变量)
使用:=符合定义
// 示例,相当于省略了var
s := "hello"
注:使用:=定义变量时,不可以使用在全局变量,只能使用在函数内
常量(枚举)
- 声明格式: const name [type] = value
- 特殊常量iota: 在const关键字出现时将被重置为0,const中每新增一行常量声明,都将使iota计数一次(可以理解为const语句块中的行索引)
条件和循环
- if…else if…else… 条件语句,需要注意的是:条件不需要加上括号()
- for循环(注意不需要括号):for init; condition; post {}
- for each range循环:对字符串、数组、切片等进行迭代输出元素
函数
- 定义:func function_name(xxx)[return_type]{}
- 可返回多个值:func func_name(xxx) (xx,xx) { return xx, xx}
- 函数作为参数:func func_name(op func(xxx) xx){}
- 没有默认参数、可选参数
示例:
func apply(op func(int, int) int, a, b int) int {
fmt.Printf("calling %s with %d, %d\n", runtime.FuncForPC(reflect.ValueOf(op).Point()).Name(), a, b)
return op(a, b)
}
指针
- 指标变量声明:var name *type
- 赋值(&):name = &a
- 获取指针所指向的内容:*name
- 指向指针的指针变量(多了一个*):
- 声明:var name **type
- 访问指向的内容:**name
示例:
var a int = 2
var ptr *int =