Golang学习网站
菜鸟教程
进度:Go 语言常量
Go语言入门教程(语言中文网)
https://kaifa.baidu.com/ 开发者搜索
Bilibili教学视频
8-import导包路径问题与init方法调用流程_哔哩哔哩_bilibili
极客时间 - 训练营
《8 小时上手 Go 语言》 极客时间训练营-让优秀的人一起学习
《Go 工程师进阶14讲》 极客时间训练营-让优秀的人一起学习
Golang介绍
主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译型语言的性能与安全性”。
是静态编译严格类型语言。
Google开源、编译型语言、21世纪的C语言。
1.18版本正式支持泛型。
修改GOPATH工作空间
修改GOPATH命令(修改后重启命令行查看):setx GOPATH C:\workspace;D:\workspace2;
goland使用教程
1.编辑运行/调试配置
每次创建项目之后,我们都需要对 Goland 进行一些配置,在 Goland 的右上方找到“Add Configuration”并单击。
点击 Add Configuration
在弹出的窗口中点击“+”,并在下拉菜单中选择“Go Build”。
编辑配置信息
点击“Go Build”之后,在窗口中填写对应的信息,如下所示。
上图中有以下几点需要注意:
- 名称:为本条配置信息的名称,可以自定义,也可以使用系统默认的值;
- Run kind:这里需要设置为“Directory”;
- Directory:用来设置 main 包所在的目录,不能为空;
- Output directory:用来设置编译后生成的可执行文件的存放目录,可以为空,为空时默认不生成可执行文件;
- Working directory:用来设置程序的运行目录,可以与“Directory”的设置相同,但是不能为空。
- go.mod:最外层main包目录需放置一个go.mod文件,内容为:
格式:
module [main包所在目录名称]
go [go version]
例如:
module bilibili-learn
go 1.19
提示:除了上面提到的几点外,其余的配置项使用系统的默认值即可,无需修改。
2.goland快捷键
GoLand常用快捷键(转)_Lucky小黄人的博客-优快云博客_goland快捷键
GoLand支持各种编辑器的快捷键映射:File->Settings->Keymap
查找
Ctrl+R 替换文本
Ctrl+F 查找文本
Ctrl+Shift+F 全局查找
F4 查找变量来源
Ctrl+Alt+F12 资源管理器打开文件夹
文件相关
Ctrl+E 打开最近浏览过的文件
Ctrl+Shift+E 打开最近修改的文件
Ctrl+Shift+N 查找文件
双击shift 最近打开过的文件
选择
Alt+Shift+左键长按 移动鼠标矩形选择内容
编辑
Ctrl + Alt + Enter 当前行的上方插入空行
Shift + Enter 当前行的下方插入空行
Ctrl+C 或 Ctrl+Insert 拷贝光标所在行或选中的内容
Ctrl+D 复制光标所在行或选中的内容(复制到下一行)
Ctrl+X 剪切光标所在行或选中的内容
Ctrl+Y 删除光标所在行
Ctrl+Z 撤销
Ctrl+Shift+Z 反向撤销
Ctrl+W 选中光标所在的代码块,多次触发,代码块会逐级变大
Ctrl+/ 单行注释或取消
Ctrl+Shift+/ 多行注释或取消
Ctrl++ 折叠代码块、结构体或函数
Ctrl+- 展开代码块、结构体或函数
Ctrl + Alt + Left/Right 回退或前进到上次光标所在位置
Ctrl+Alt+Enter 当前行的上方插入空行
Shift+Enter 当前行的下方插入空行
Ctrl+Backspace 按单词进行删除
Alt+Shift+Up/Down 可以将光标所在行的代码上下移动
Ctrl+Shift+U 将选中内容进行大小写转化
Alt+ ↑/↓ 在方法间快速移动定位
Alt+1 快速打开或隐藏工程面板
Alt+J 相同单词多选
导航
Ctrl+G 快速定位到某行
Ctrl+B 跳转至方法或结构体的定义或引用处
Ctrl+左键单击 等同于 Ctrl+B
Ctrl+Alt+Left/Right 回退或前进到上次光标所在位置
Page Up 向上滚动一页
Shift+PageUp 向上滚动一页并选中
PageDown 向下滚动一页
Shift+PageDown 向下滚动一页并选中
Ctrl+PageUp 跳转至当前显示框的首行
Ctrl+Shift+PageUp 跳转至当前显示框的首行并选中
Ctrl+Page Down 跳转至当前显示框的末行
Ctrl+Shift+PageDown 跳转至当前显示框的末行并选中
Home 跳转至行首
Shift+Home 跳转至行首并选中
End 跳转至行尾
Shift+End 跳转至行尾并选中
Ctrl+Home 跳转至文件首行
Ctrl+Shift+Home 跳转至文件首行并选中
Ctrl+End 跳转至文件尾行
Ctrl+Shift+End 跳转至文件尾行并选中
自动代码
Alt+Enter 导入包,自动修正
Ctrl+Alt+L 格式化代码
Ctrl+Alt+I 自动缩进
Ctrl+Alt+O 优化导入的类和包
Alt+INSERT 生成代码(如GET,SET方法,构造函数等)
Ctrl+SHIFT+SPACE 自动补全代码
Ctrl+空格 代码提示
Ctrl+Alt+SPACE 类名或接口名提示
Ctrl+P 方法参数提示
Ctrl+J 自动代码
Ctrl+Alt+T 把选中的代码放在 TRY{} IF{} ELSE{} 里
Shift+F6 重构-重命名,重命名文件夹、文件、方法、变量名等
Ctrl+I 实现接口
Ctrl+SHIFT+Space 智能类型推断式返回(return关键字后使用)
Ctrl+Alt+V 自动生成表达式返回值
Ctrl+Alt+M 重构表达式为函数(光标在表达式末尾)
Ctrl+Space 快速返回实现(return关键字后使用)
3.goland代码静态检测
使用 GoLand 编写 Go 代码时,可以配合 gofmt + goimports + golangci-lint 在保存时完成对代码的格式化和质量检测。
3.1 开启 go fmt
在每次保存代码文件时自动格式化代码。
File > Settings > Tools > File Watchers > + > go fmt
3.2 开启 goimports
在每次保存代码时自动添加缺失的和删除未引用的包。
File > Settings > Tools > File Watchers > + > goimports
如果插件详情界面显示红色,如下图所示,表示 goimports 插件未安装。
需要我们手动安装,安装方法一般有三个:
(1)点击 Tools > Go Tools > Goimports File,如果没有安装 goimports,则会提示未安装,按照指引,点击安装链接即可。
(2)打开 Terminal 工具窗口(View > Tool Windows > Terminal),然后执行 go get golang.org/x/tools/cmd/goimports 命令,goimports.exe 将被安装到 GOPATH/bin 目录下。
(3)通过源码安装。将仓库 https://github.com/golang/tools.git clone 到 $GOPATH/src/golang.org/x/tools,然后进入 cmd 目录下执行:go install golang.org/x/tools/cmd/goimports,会在 $GOPATH/bin 目录下生成 goimports.exe 文件。
goimports 检测代码有 2 种方式,如果下面不加 -w 仅打印修正 import 包后的结果,如果加了 -w 会修正 import 包然后将修正后的代码覆盖原始内容。
# 可以指定单个文件或目录
goimports - w file
goimports - w directory
3.3 开启 golangci-lint
开启 golangci-lint 可以对代码进行静态检查,比如报告函数行数超标、文件行数超标等来帮助规范代码。
开启配置:
File > Settings > Tools > File Watchers > + > golangci-lint
如果本地未安装 golangci-lint,会显示红色,如下图所示:
安装方法主要有两个:
(1)执行命令:
go get -u github.com/golangci/golangci-lint/cmd/golangci-lint
(2)手动下载可执行文件。下载地址是 golangci-lint 在 Github 发布页面 releases。
配置文件:
golangci-lint 会从第一个分析路径的目录到根目录的所有目录中搜索配置文件。如果没有找到配置文件,将尝试在 home 目录中搜索。要查看正在使用哪个配置文件,以及从何处获取配置文件,请使用 -v 选项运行 golangci-lint。
golangci-lint 的配置文件可以是下面中的任意一个:
.golangci.yml
.golangci.yaml
.golangci.toml
.golangci.json
golangci-lint 有对应的配置文件来告诉其如何检测代码,配置文件放到工程的根目录。比如配置文件 .golangci.yaml:
linters-settings:
funlen:
lines: 80
statements: 80
goconst:
min-len: 2
min-occurrences: 2
gocyclo:
min-complexity: 20
golint:
min-confidence: 0
govet:
check-shadowing: true
lll:
line-length: 120
errcheck:
check-type-assertions: true
linters:
disable-all: true
enable:
- bodyclose
- deadcode
- funlen
- goconst
- gocyclo
- gofmt
- ineffassign
- staticcheck
- structcheck
- typecheck
- goimports
- golint
- gosimple
- govet
- lll
- rowserrcheck
- unused
- varcheck
run:
skip-dirs:
- tars-protocol
skip-files:
- _test.go
service:
golangci-lint-version: 1.23.x
关于 golangci-lint 的使用详见其官方文档。
安装VSCode插件
核心是配置国内下载源,我们需要修改如下两个go的环境配置:
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn
VSCode插件
Code Runner:代码一键运行
键盘快捷键 Ctrl+Alt+N
快捷键 F1 调出 命令面板, 然后输入 Run Code
在编辑区,右键选择 Run Code
在左侧的文件管理器,右键选择 Run Code
右上角的运行小三角按钮
停止代码运行
- 键盘快捷键 Ctrl+Alt+M
- 快捷键 F1 调出 命令面板, 然后输入 Stop Code Run
- 在Output Channel,右键选择 Stop Code Run
语法
:= 是声明变量并赋值,只能被用在函数体内。
chan 通道(channel)是一种特殊的类型。在任何时候,同时只能有一个 goroutine 访问通道进行发送和获取数据。goroutine 间通过通道就可以通信。通道像一个传送带或者队列,总是遵循先入先出(First In First Out)的规则,保证收发数据的顺序。声明通道时,需要指定将要被共享的数据的类型。
Slice 语言切片,是对数组的抽象。功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
range 语言范围,关用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。
nil 是 map、slice、pointer、channel、func、interface 的零值。nil 是不能比较的。
import(
"Golang/5-init/lib1"
"Golang/5-init/lib2"
//其他写法
_ "Golang/5-init/lib2" //匿名,无法使用当前包的方法,但是会执行lib1包内部的init()
myLib2 "Golang/5-init/lib2" //别名调用myLib2.Lib2Test
. "Golang/5-init/lib2" //直接Lib2Test()调用方法
)
Go命令教程
https://github.com/hyper0x/go_command_tutorial
Go 语言基础知识的导图
Go 语言学习路径的导图
Github上的优秀Go项目
Go语言fmt包Printf方法详解
Go语言的标准输出流在打印到屏幕时有些参数跟别的语言(比如C#和Java)不同,下面是我整理的一些常用的格式化输入操作。
General
%v 以默认的方式打印变量的值
%T 打印变量的类型
Integer
%+d 带符号的整型,fmt.Printf("%+d", 255)输出+255
%q 打印单引号
%o 不带零的八进制
%#o 带零的八进制
%x 小写的十六进制
%X 大写的十六进制
%#x 带0x的十六进制
%U 打印Unicode字符
%#U 打印带字符的Unicode
%b 打印整型的二进制
Integer width
%5d 表示该整型最大长度是5,下面这段代码fmt.Printf("|%5d|", 1)
fmt.Printf("|%5d|", 1234567)
输出结果如下:| 1|
|1234567|%-5d则相反,打印结果会自动左对齐
%05d会在数字前面补零。
Float
%f (=%.6f) 6位小数点
%e (=%.6e) 6位小数点(科学计数法)
%g 用最少的数字来表示
%.3g 最多3位数字来表示
%.3f 最多3位小数来表示
String
%s 正常输出字符串
%q 字符串带双引号,字符串中的引号带转义符
%#q 字符串带反引号,如果字符串内有反引号,就用双引号代替
%x 将字符串转换为小写的16进制格式
%X 将字符串转换为大写的16进制格式
% x 带空格的16进制格式
String Width (以5做例子)
%5s 最小宽度为5
%-5s 最小宽度为5(左对齐)
%.5s 最大宽度为5
%5.7s 最小宽度为5,最大宽度为7
%-5.7s 最小宽度为5,最大宽度为7(左对齐)
%5.3s 如果宽度大于3,则截断
%05s 如果宽度小于5,就会在字符串前面补零
Struct
%v 正常打印。比如:{sam {12345 67890}}
%+v 带字段名称。比如:{name:sam phone:{mobile:12345 office:67890}
%#v 用Go的语法打印。
比如main.People{name:”sam”, phone:main.Phone{mobile:”12345”, office:”67890”}}
Boolean
%t 打印true或false
Pointer
%p 带0x的指针
%#p 不带0x的指针
VSCode调试GO项目报go.mod未存在解决方法
go.mod不存在时编译会报错
go: go.mod file not found in current directory or any parent directory; see 'go help modules'
Compilation finished with exit code 1
在源码文件(如Test.go)同文件夹(golang-core-36)内创建go.mod,内容如下
格式:
module [main包所在目录名称]
go [go version]
例如:
module golang-core-36
go 1.19
如何理解 Golang 中的"并发"?
学到什么
- 并发与并行的区别?
- 什么是 Goroutine?
- 什么是通道?
- Goroutine 如何通信?
- 相关函数的使用?
select
语句如何使用?
并发与并行
为了更有意思的解释这个概念,我借用知乎上的一个回答:
- 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
- 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
- 你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。
对应到 CPU 上,如果是多核它就有同时执行的能力,即有并行的能力。
对于 Go 语言,它自行安排了我们的代码合适并发合适并行。