Go语言初学前两天学习记录和总结 | 青训营笔记

105 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记。

第一天

一.环境配置篇

使用IDEA编写Golang语言:

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

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

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

  3. 配置GOROOT即可使用。

运行go文件:

  1. go run + go文件路径地址。
  2. 先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)

通过通信共享内存。

image.png

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 + 后缀

  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测试大同小异。

总结

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