Golang语言初学学习记录和总结 | 青训营笔记01

Golang语言初学学习记录和总结

第一天

环境配置篇

使用IDEA编写Golang语言:

  1. https://golang.org/dl/ 点击链接去官网下载golang安装包,下载安装即可,类似于jdk。

  2. 配置系统环境变量GOROOT为安装目录,Path配置bin目录地址,类似于jdk。

  3. IDEA下载Go插件,重启。

  4. 配置GOROOT即可使用。

运行go文件:

  1. go run + go文件路径地址。
  2. 先go build + go文件路径进行编译 再 ./对应编译生成的文件即可!

变量赋值

1
2
3
4
5
6
7
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

数组声明

1
2
3
var a [5]int

b := [5]int{1, 2, 3, 4, 5}

切片要牢记,类似Python

1
2
3
4
5
6
7
8
9
10
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使用

1
2
3
4
5
6
7
8
9
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

用来更灵活的遍历集合元素

方法

返回值在后面,先变量名再变量类型

1
2
3
4
5
6
7
8
9
10
11
12
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
}

指针

1
2
3
func add2ptr(n *int) {
*n += 2
}

可以使用指针对原数据进行修改,类似于C语言

结构体方法

1
2
3
4
func (u user) checkPassword(password string) bool {
u.password = "zty"
return u.password == password
}

在方法名前面添加(结构体名称 结构体类型)即可,可以通过结构体调用该方法。

异常

1
2
3
4
5
6
7
8
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常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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包,使用可以使用锁功能

协程创建:

1
2
3
4
go func(j int) {// go必不可少
defer wg.Done()
hello(j)
}(i)//协程名称

CSP(Communicating Sequential Processes)

通过通信共享内存。

Channel

创建信道,给信道赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

1
2
3
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 + 后缀

  1. @update 默认下载最新版
  2. @none 删除依赖
  3. @v1.1.2 tag版本,语义版本
  4. @23dfdd5 特定的commit
  5. @master 分支的最新commit

测试

  • 所有测试文件以_test.go结尾
  • func TestXxx(*testing.T)
  • 初始化逻辑放到TestMain中
  1. 单元测试assert包
  2. 加–cover得到测试代码覆盖率
  3. Mock设置打桩函数,可以替换内置函数达到不用频繁更换测试数据的目的。
  4. 测试基准,测试服务器运行速率
  5. 其余和Java测试大同小异。

总结

  • 需要多加练习!
  • 熟悉各种语法的使用!
  • 认真听课!
  • 好好睡觉!

Golang语言初学学习记录和总结 | 青训营笔记01
https://zty-f.github.io/2022/05/08/Golang语言初学学习记录和总结-|-青训营笔记01/
作者
ZTY
发布于
2022年5月8日
更新于
2025年1月2日
许可协议