Golang基础复习
1.Go-常用命令
直接再终端输入 go help
即可显示所有的go命令以及相应命令功能简介,主要有下面这些。
- build: 编译包和依赖,生成.exe
go build xxx.go ->
./hello.exe
💥 - clean:移除对象文件
- doc:显示包或者符号的文档
- env:打印go的环境信息
- bug:启动错误报告
- fix : 运行go tool fix
- fmt: 运行gofmt进行格式化
- generate: 从processing source生成go文件
- get: 下载并安装依赖
go get xxxx
💥 - install 编译并安装包和依赖
go list
- list: 列出包
- run: 编译并运行go程序 💥
- test: 运行测试
go run xxx.go
- tool: 运行go提供的工具
- version: 显示go的版本
- vet: 运行go tool vet
Go语言的所有包全在这里搜索
: https://pkg.go.dev/
(1).添加依赖-(配置代理)
go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn #一定要添加代理,要不然 go get xxxx
实战演练:
PS C:\Environment\GoWorks\src\demo> go get github.com/go-sql-driver/mysql go: added github.com/go-sql-driver/mysql v1.7.0
添加完毕之后会在 go.mod中新增
2.创建一个项目的步骤
- 创建项目
- 初始化项目
go mod init 项目名
- 创建包
- 创建模块
创建一个包,然后下面放入一些.go文件
- 相互调用
test包下hello.go文件
方法名开头大写就是公有方法。小写就是私有方法
package test // 方法名为小写的话,那么就是私有的 func hello() string { return "hello" } // 方法名为大写的话,那么就是公用 func Hello() string { return "Hello" }
主项目下创建一个main.go文件。通过包名进行调用方法
package main import "demo/test" //导入包 func main() { // 注意我们这里用的是 包名. 进行调用的,因为Go语言中没有类的概念, println(test.Hello()) //调用共有的,私有的调用不了 }
3.golang标识符、关键字、命名规则
(1).标识符
标识符的英文是: identifer
.通俗的讲:就是给变量、常量、函数、方法、结构体、数组、切片、接口起名字。
标识符的组成
- 标识符只能由数字、字母和下划线组成。
- 只能以字母和下划线开头
- 标识符区分大小写
(2).关键字
25个关键字
(3).命名规则
- 包名称:
保持package的名字和目录一致,尽量能够见名识意。包名应该小写单词,不要使用下划线或则混合大小写。
package demo
- 文件命名:
见名识意应该为小写单词,使用下划线分割每一个单词
user_mapper.go
- 结构体命名
采用驼峰式命名,首字母根据公有私有访问控制大写或者小写
type student struct{} //私有结构体 type Student struct{} //公有结构体
- 接口命名
采用驼峰式命名,首字母根据公有私有访问控制大写或者小写。单个函数的结构名以 “er” 作为后缀。
type Reader interface{ Read(p []byte) }
- 变量命名
采用驼峰式命名,首字母根据公有私有访问控制大写或者小写。但遇到特有名字的时候,要遵循以下的规则:
如果变量为私有,且特有名词为首个单词,则使用小写,如appService若变量类型为bool类型,则名称应为Hash,is,Can或Allow开头。
var isExist bool var hasConfict bool var canMange bool var allowGitHook bool
- 单元测试
单元测试文件命名规范为 example_test.go
。测试用例额的函数名必须以Test开头。例如: TestExample。
4.变量
- 变量的定义
var identify type --- var( idetify type idetify type ) --- 语法糖,这里只能在函数的内部我们才能使用,函数外部不能使用!!! identy:=value ---
- 变量的初始化
var identify type=value --- var( identify type=value ) --- // 类型会对其进行自动寻找,可以不用可以设置变量的类型的 var identify1,identify2,identifyN =value1,value2,value3 --- // 函数返回多个值时 identify1,identify2=function3() --- // 匿名变量 _,identify=function3()
5.常量
- 常量的定义且赋值
const identify type=value 常量一旦定义之后,我们就不能对其进行修改的操作了。 --- const( identify type=value )
- iota
iota比较特殊,可以被认为是一个可被编译器修改的常量,它默认开始的值是0,每调用一次加1.遇到const关键字的时候被重置为0.
1. 连续会一直增加 const( a1=iota //0 a2=iota //1 a3=iota //2 )-> 0 1 2 2.使用匿名变量跳过某些值 const( a1=iota //0 _ a2=iota //2 )-> 0 2 2. 连续的时候被打断 3. const( a1=iota //0 a2=100 //100 1 a3=iota //2 )->0 100 2
6.数据类型
字符串、数字型、布尔型、数组、切片、接口、函数、管道、结构体。
(1).字符串类型
Go语言中的字符串是被双引号括起来的值。被反引号`引起来的字符串用来创建多行的消息,HTML以及正则表达式.
%T 查看类型 %c 查看字符 %v 万能取值 %s 取字符串 1. 字符串-双引号 var identify string="value" var identify="" identify:="" 2. 字符串-反引号 var identify string=` line1 line2 ` 3.字符串的拼接可以使用+号进行拼接 4.可以使用printf进行格式化进行拼接 5.使用strings.Join([]string{identify1,identify},",") 6.也可以使用bytes.Buffer进行字符串链接 (效率较高) var buffer bytes.Buffer buffer.WriteString("hello") buffer.WriteString(",") buffer.WriteString("jsxs") s := buffer.String() 7. 转义字符 \n ->换行 \t ->4个空格 \\ ->网络路径 8.字符串切片操作 var identify="xxxxx" | 获取->m-n的字符(包头不包尾) identify[m:n] | 获取->m- 到最后一个的字符 identify[m:] | 获取-> -n 从开始到n的字符 identify[:n] 9.获取字符串的长度 len(str) 10.字符串进行切割 strings.Split(str,"切割字符")->输出的是一个数组 11.是否包含字符串 strings.Contains(str,"xxx") -》bool 12.strings.ToLower(str) ->全部小写 strings.ToUpper(str) ->全部大写 13.strings.HahsPrefix(str,"xx")->是否以xx开头 string.HashSuffix("xxx")->是否以xx结尾 14. 查看某个字符串所在的索引位置 strings.Index(str,"xx")
(2).指针类型->引用类型
Go语言中的函数传参都是值拷贝,当我们想要修改某一个变量的时候,我么可以创建一个指向该变量的地址的指针变量。传递数据使用的指针,而无需拷贝数据。
类型指针不能进行偏移和运算。
Go语言中的指针操作非常简单,只需记住两个符号: &(取地址)和 *(根据地址取值)
指针地址和指针类型
每个变量在运行时都有一个地址,这个地址代表变量在内存中的位置。
Go语言中使用 &
字符放在变量前面对变量进行取地址操作。Go语言中的值类型(int、float、bool、string、array、struct) 都有对应的指针类型,如" *int 、 *int64、 *string等
var identify *type=&idenify
指针地址和指针类型
一个指针指向了一个值得内存地址。(也就是我们声明了一个指针之后,可以像变量赋值一样,把一个值的内存放入到指针当中
)
类似于变量和常量,在使用指针前我们需要声明指针。
1.指针的定义语法 var var_name *var_type package main import "fmt" func main() { var ip *int fmt.Printf("%T\n", ip) //*int fmt.Printf("%v\n", ip) //<nil> var num int = 10 //创建一个变量,也就是分配了一个地址 fmt.Printf("%T\n", &num) //查看取地址的类型 ip = &num // ip指向num的地址 fmt.Printf("%v", *ip) //获取值 }
- 指向数组的指针
需要借助数组进行遍历取数组的地址
1.定义语法 var ptr [n]*int; 2. 指针数组的取地址需要通过遍历的方式进行遍历赋值。 package main import "fmt" func main() { var ip [4]*int fmt.Printf("%T\n", ip) fmt.Printf("%v\n", ip) num := [4]int{1, 2, 3} fmt.Printf("%T\n", &num) for i := 0; i < len(num); i++ { ip[i] = &num[i] // 数组指针的赋值 fmt.Printf("%v\t", *ip[i]) } }