目录
1. 菜鸟go教程
2. 数组array和切片slice
array类型
array是固定长度的数组,使用前必须确定数组长度
array特点
- go中的数组是值类型,也就是说,如果你将一个数组赋值给另外一个数组,那么,实际上就是整个数组拷贝了一份
- 如果go中的数组作为函数的参数,那么实际传递的参数是一份数组的拷贝,而不是数组的指针
- array的长度也是Type的一部分,这样就说明了[10]int和[20]int是不一样的
slice类型
- slice是一个引用类型,是一个动态的指向数组切片的指针
- slice是一个不定长的,总是指向底层的数组array的数据结构
array和slice的区别
- 声明数组时,方括号内写明了数组的长度;而声明slice的时候,方括号内为空
- 作为函数参数时,数据传递的是数组的副本,而slice传递的是指针
array和slice的声明和初始化
// array语法声明格式
var variable_name [SIZE] variable_type
// 长度为10 类型为float32的数组
var balance [10] float32
// 数组初始化有2种方式
var balance = [5]float32{1000.0,2.0,3.3,4.5,55.3}
var balance = [...]flowat{1000.0,2.0,3.3,4.5,55.3,4.444}
s := [3]int{1,2,3}
// slice语法声明格式,这种方式不需要声明长度
var identifier []type
var a1 []int
// 也可用make()函数来创建
var slice1 []type = make([]type, len)
slice1 := make([]type, len)
s1 := make([]int,10)
// 还可以指定容量
make([]T, length, capacity)
// 切面初始化
s :=[]int{1,2,3 } // 跟数组的区别就是没有声明长度
// 基于数组来初始化
var arr = [10]{1,2,3,4,5,6,7,8,9,10}
// 初始化切片s,是数组arr的引用
s := arr[:]
// 将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片
s := arr[startIndex:endIndex]
// 默认 endIndex 时将表示一直到arr的最后一个元素
s := arr[startIndex:]
// 默认 startIndex 时将表示从arr的第一个元素开始
s := arr[:endIndex]
// 通过切片s初始化切片s1
s1 := s[startIndex:endIndex]
3. go的fmt占位符
普通占位符
占位符 | 说明 | 举例 | 输出 |
---|---|---|---|
%v | 相应值的默认格式 | Printf("%v", people) | {zhangsan} |
%+v | 打印结构体时,会添加字段名 | Printf("%+v", people) | {Name:zhangsan} |
%#v | 相应值的Go语法表示 | Printf("#v", people) | main.Human{Name:“zhangsan”} |
%T | 相应值的类型的Go语法表示 | Printf("%T", people) | main.Human |
%% | 字面上的百分号,并非值的占位 | Printf("%%") | % |
布尔占位符
占位符 | 说明 | 举例 | 输出 |
---|---|---|---|
%t | true 或 false | Printf("%t", true) | true |
整数占位符
占位符 | 说明 | 举例 | 输出 |
---|---|---|---|
%b | 二进制表示 | Printf("%b", 5) | 101 |
%c | 相应Unicode码点所表示的字符 | Printf("%c", 0x4E2D) | 中 |
%d | 十进制表示 | Printf("%d", 0x12) | 18 |
%o | 八进制表示 | Printf("%d", 10) | 12 |
%q | 单引号围绕的字符字面值,由Go语法安全地转义 | Printf("%q", 0x4E2D) | ‘中’ |
%x | 十六进制表示,字母形式为小写 a-f | Printf("%x", 13) | d |
%X | 十六进制表示,字母形式为大写 A-F | Printf("%x", 13) | D |
%U | Unicode格式:U+1234,等同于 “U+%04X” | Printf("%U", 0x4E2D) | U+4E2D |
浮点数和复数的组成部分(实部和虚部)
占位符 | 说明 | 举例 | 输出 |
---|---|---|---|
%b | 无小数部分的,指数为二的幂的科学计数法,与 strconv.FormatFloat 的 ‘b’ 转换格式一致。例如 -123456p-78 | ||
%e | 科学计数法,例如 -1234.456e+78 | Printf("%e", 10.2) | 1.020000e+01 |
%E | 科学计数法,例如 -1234.456E+78 | Printf("%E", 10.2) | 1.020000E+01 |
%f | 有小数点而无指数,例如 123.456 | Printf("%f", 10.2) | 10.200000 |
%g | 根据情况选择 %e 或 %f 以产生更紧凑的(无末尾的0)输出 | Printf("%g", 10.20) | 10.2 |
%G | 根据情况选择 %E 或 %f 以产生更紧凑的(无末尾的0)输出 | Printf("%G", 10.20+2i) | (10.2+2i) |
字符串与字节切片
占位符 | 说明 | 举例 | 输出 |
---|---|---|---|
%s | 输出字符串表示(string类型或[]byte) | Printf("%s", []byte(“Go语言”)) | Go语言 |
%q | 双引号围绕的字符串,由Go语法安全地转义 | Printf("%q", “Go语言”) | “Go语言” |
%x | 十六进制,小写字母,每字节两个字符 | Printf("%x", “golang”) | 676f6c616e67 |
%X | 十六进制,大写字母,每字节两个字符 | Printf("%X", “golang”) | 676F6C616E67 |
指针
占位符 | 说明 | 举例 | 输出 |
---|---|---|---|
%p | 十六进制表示,前缀 0x | Printf("%p", &people) | 0x4f57f0 |
4. GoLand的配置
本地go环境
访问Go国内镜像站下载页面 下载,并在页面最上方的版本中选择你当前的系统版本,会下载最新版本的Go开发包,下载完后一路下一步。
配置goroot
File | Settings | Go | GOROOT,选到本地go环境安装目录
配置go mod(go的包管理工具)
PS:这就是很多文章里写的vgo配置。
File | Settings | Go | Go Modules,环境参数填上:GOPROXY=https://goproxy.cn
可选择的反向代理地址有:
- https://goproxy.cn
- https://goproxy.io
- https://mirrors.aliyun.com/goproxy/
5. 新建go项目
- 新建一个go.mod文件,用于管理go包,其中go的版本只到2级,即:1.16
- 新建一个main.go文件,用于启动类,package也要是main
- 配置goland的go mod配置,参考上一个配置
6. import导入包时:点. 、下划线_ 、别名的用法
例子
import (
v2 "github.com/YFJie96/wx-mall/controller/api/v2"
_ "github.com/YFJie96/wx-mall/docs"
. "fmt"
"github.com/gin-gonic/gin"
"github.com/swaggo/gin-swagger"
"github.com/swaggo/gin-swagger/swaggerFiles"
)
别名v2:
此处的v2相当于是上述导入包的一个别名,我们可以直接使用 v2.WxLogin来调用包中的接口或方法。
下划线_:
在导入路径前加入下划线表示只执行该库的 init 函数而不对其它导出对象进行真正地导入。因为 Go 语言的数据库驱动都会在 init 函数中注册自己,所以我们只需要进行上述操作即可;否则的话,Go 语言的编译器会提示导入了包却没有使用的错误。
点.:
此处的.,含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用的fmt.Println(“hello world”) 可以省略的写成Println(“hello world”)
7. Golang应用
TOML配置处理
https://www.cnblogs.com/CraryPrimitiveMan/p/7928647.html
鼠标键盘截图等用robotgo
https://github.com/go-vgo/robotgo/blob/master/README_zh.md
对比图片是否相似用goimagehash
https://github.com/videoProcess/goimagehash
8. Goland开发细节
- func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数,导入包时用的下划线的情况,只导入init函数)
- 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。
- Go 没有三目运算符,所以不支持 ?: 形式的条件判断。
- defer 语句会将其后面跟随的语句进行延迟处理,在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,也就是说,先被 defer 的语句最后被执行,最后被 defer 的语句,最先被执行。关键字 defer 的用法类似于面向对象编程语言 Java 和 C# 的 finally 语句块,它一般用于释放某些已分配的资源,典型的例子就是对一个互斥解锁,或者关闭一个文件。