这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记。
第一天
一.环境配置篇
使用IDEA编写Golang语言:
1. golang.org/dl/ 点击链接去官网下载golang安装包,下载安装即可,类似于jdk。
-
配置系统环境变量GOROOT为安装目录,Path配置bin目录地址,类似于jdk。
-
IDEA下载Go插件,重启。
-
配置GOROOT即可使用。
运行go文件:
- go run + go文件路径地址。
- 先go build + go文件路径进行编译 再 ./对应编译生成的文件即可!
变量赋值
var a = "initial"
var b, c int = 1, 2
var d = true
f := 4
go语言是—门强类型语言,每—个变量都有它自己的变量类型。常见的变量类型包括字符串整数浮点型、布尔型等。go 语言的字符串是内置类型,可以直接通过加号拼接,也能够直接用等于号去比较两个字符串。在go语言里面,大部分运算符的使用和优先级都和C或者C++类似,这里就不再概述。 下面讲述go语言里面的变量的声明,在go语言里面变量的声明有两种方式,一种是通过var namestig =""这种方式来声明变量,声明变量的时候,一般会自动去推导变量的类型。另—种声明变量的方式是:使用变量冒号:=等于值。下面来讲说常量。常量的话就是把var改成const,值在一提的是go语言里面的常量,它没有确定的类型,会根据使用的上下文来自动确定类型。
循环只有for循环,if不用加(),Switch不用break
数组声明
var a [5]int
b := [5]int{1, 2, 3, 4, 5}
切片要牢记,类似Python
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2]) // c
fmt.Println("len:", len(s)) // 3
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println(s) // [a b c d e f]
range使用
nums := []int{2, 3, 4}
sum := 0
for i, num := range nums {
sum += num
if num == 2 {
fmt.Println("index:", i, "num:", num) // index: 0 num: 2
}
}
fmt.Println(sum) // 9
用来更灵活的遍历集合元素
方法
返回值在后面,先变量名再变量类型
func add(a int, b int) int {
return a + b
}
func add2(a, b int) int {
return a + b
}
func exists(m map[string]string, k string) (v string, ok bool) {
v, ok = m[k]
return v, ok
}
指针
func add2ptr(n *int) {
*n += 2
}
可以使用指针对原数据进行修改,类似于C语言
结构体方法
func (u user) checkPassword(password string) bool {
u.password = "zty"
return u.password == password
}
在方法名前面添加(结构体名称 结构体类型)即可,可以通过结构体调用该方法。
异常
func findUser(users []user, name string) (v *user, err error) {
for _, u := range users {
if u.name == name {
return &u, nil
}
}
return nil, errors.New("not found")
}
通过errors包下面的error进行处理。可以通过方法返回值返回错误。
strings常用方法
a := "hello"
fmt.Println(strings.Contains(a, "ll")) // true
fmt.Println(strings.Count(a, "l")) // 2
fmt.Println(strings.HasPrefix(a, "he")) // true
fmt.Println(strings.HasSuffix(a, "llo")) // true
fmt.Println(strings.Index(a, "ll")) // 2
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo
fmt.Println(strings.Repeat(a, 2)) // hellohello
fmt.Println(strings.Replace(a, "e", "E", -1)) // hEllo
fmt.Println(strings.Split("a-b-c", "-")) // [a b c]
fmt.Println(strings.ToLower(a)) // hello
fmt.Println(strings.ToUpper(a)) // HELLO
fmt.Println(len(a)) // 5
b := "你好"
fmt.Println(len(b)) // 6 一个中文可能对应多个字符
time包可以获取时间以及常见时间操作
strconv包可以进行数字和字符串转换
。。。。。。。
第二天
并发
协程
Goroutine
导入sync包,使用可以使用锁功能
协程创建:
go func(j int) {// go必不可少
defer wg.Done()
hello(j)
}(i)//协程名称
CSP(Communicating Sequential Processes)
通过通信共享内存。
Channel
创建信道,给信道赋值
src := make(chan int)//无缓冲信道
dest := make(chan int, 3)//有缓冲信道
go func() {
defer close(src)
for i := 0; i < 10; i++ {
src <- i
}
}()
go func() {
defer close(dest)
for i := range src {
dest <- i * i
}
}()
并发安全Lock
lock:=sync.Mutex{//语句}
lock.Lock()
lock.Unlock()
WaitGroup 类似于Java的CountDown和Semaphore
计数器 开启协程+1;执行结束-1;主协程阻塞直到计数器为0。
依赖管理
GOPATH->Go Vender->GO Module
依赖管理三要素 1.配置文件,描述依赖 go.mod 2.中心仓库管理依赖库 Proxy 3.本地工具 go get/mod
go mod
init 初始化 download 下载模块到本地缓存 tidy 增加需要的依赖,删除不需要的依赖
go get
go get 项目路径/pkg + 后缀
- @update 默认下载最新版
- @none 删除依赖
- @v1.1.2 tag版本,语义版本
- @23dfdd5 特定的commit
- @master 分支的最新commit
测试
- 所有测试文件以_test.go结尾
- func TestXxx(*testing.T)
- 初始化逻辑放到TestMain中
- 单元测试assert包
- 加--cover得到测试代码覆盖率
- Mock设置打桩函数,可以替换内置函数达到不用频繁更换测试数据的目的。
- 测试基准,测试服务器运行速率
- 其余和Java测试大同小异。
总结
- 需要多加练习!
- 熟悉各种语法的使用!
- 认真听课!
- 好好睡觉!