Golang学习笔记

Golang学习网站

菜鸟教程

Go 语言教程 | 菜鸟教程

进度:Go 语言常量

Go语言入门教程(语言中文网)

Go语言入门教程,Golang入门教程(非常详细)

https://kaifa.baidu.com/ 开发者搜索

开发者搜索-Beta-让技术搜索更简单高效

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”并单击。

Golang学习笔记_第1张图片

点击 Add Configuration
在弹出的窗口中点击“+”,并在下拉菜单中选择“Go Build”。

Golang学习笔记_第2张图片

编辑配置信息
点击“Go Build”之后,在窗口中填写对应的信息,如下所示。

Golang学习笔记_第3张图片


上图中有以下几点需要注意:

  • 名称:为本条配置信息的名称,可以自定义,也可以使用系统默认的值;
  • 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常用快捷键 - 知乎

GoLand常用快捷键(转)_Lucky小黄人的博客-CSDN博客_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 插件未安装。

Golang学习笔记_第4张图片

需要我们手动安装,安装方法一般有三个:
(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,会显示红色,如下图所示:

Golang学习笔记_第5张图片

 安装方法主要有两个:
(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 语言基础知识的导图

https://static001.geekbang.org/resource/image/ad/85/add8566dc5431378bda313a32a6ebb85.jpg?wh=2602*10316

Go 语言学习路径的导图

https://static001.geekbang.org/resource/image/c7/b7/c702df29da67be3c4083ecce1d0eadb7.png?wh=1820*7490

Github上的优秀Go项目

https://static001.geekbang.org/resource/image/29/f8/29c794731d9fb43f9fd37cc4d91994f8.png?wh=1920*4240

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学习笔记_第6张图片

如何理解 Golang 中的"并发"?

如何理解 Golang 中的"并发"? - 知乎

学到什么

  1. 并发与并行的区别?
  2. 什么是 Goroutine?
  3. 什么是通道?
  4. Goroutine 如何通信?
  5. 相关函数的使用?
  6. select 语句如何使用?

并发与并行

为了更有意思的解释这个概念,我借用知乎上的一个回答:

  • 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
  • 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
  • 你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

并发的关键是你有处理多个任务的能力,不一定要同时。

并行的关键是你有同时处理多个任务的能力。

对应到 CPU 上,如果是多核它就有同时执行的能力,即有并行的能力。

对于 Go 语言,它自行安排了我们的代码合适并发合适并行。

golang的struct tag

golang的struct tag_地鼠工程师的博客-CSDN博客

你可能感兴趣的:(golang,学习,开发语言)