Go第一课 | 青训营笔记

534 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天,70多分钟快速入门了下Go语言,课程一:简要介绍了语法,包括for、switch和其他语言的不同,以及map、切片等常用的数据结构;课程二:主要是三个例子:猜数、翻译单词、socks5实现。

封面来自于go.dev/blog/gopher

课程一

语法概述,主要记录下和其他语言的不同点

Go特点

高性能高并发,带GC,标准库丰富

语法

  1. 变量
    两种形式 a := float64(2.71) 或者 var a = float64(2.71)
  2. 控制\
  • if:写法 if a < b {} 条件没有小括号,语句必须写在大括号里边
  • for:条件没有括号
  • 没有常见的while, 可直接 for {}+break来代替
  • switch:case默认有break,switch 也可以不加条件,case一个一个判断
  1. range遍历
    数组:for index, num := range xxx map:for key, val := range xxx
  2. 结构体及结构体函数
type xxx struct{}
func (x xxx) funname(){}
  1. 字符串格式化
    "%v"任意打印,"%+v"详细信息
  2. 切片
    GO中三种方式创建切片 第一种方式:var 切片名 []数据类型
var s1[]string
fmt.Println(s1)
fmt.Println(len(s1))

第二种方式:切片名 := []类型{}

s2 := []int{}
fmt.Println(s2)
fmt.Println(len(s2))

第三种方式:使用make()函数创建:make(切片类型,长度,容量)

s3 := make([]int, 3, 5)
fmt.Println(s3)
fmt.Println(len(s3))
fmt.Println(cap(s3))
  1. 数组
    声明数组var a [3]int
    初始化数组a := [3]int{1,2,3} 可以隐式不写大小a := [...]int{1,2,3}

课程二

猜数

rand必须要选种子rand.Seed(time.Now().UnixNano()),要不rand都是一个值

作业实现

见RepoGITHUB

1

直接用fmt.Scanf("%s", &input)存input

2

用百度翻译API,接入详见百度-通用翻译API接入文档,如需使用repo代码们需要接入后获取appid和密钥,填写到constructbaidurequest函数相应的位置

  1. 平台注册 image.png
  2. postman测试 用postman请求接口测试 image.png
  3. 写请求代码 与上课内容类似,也是写一个结构体,注意sign参数需要计算多字段和的MD5,直接调用md5.Sum(data)即可
	data := []byte(request.appid + request.q + request.salt + pass)
	//fmt.Printf("%x", md5.Sum(data))
	request.sign = fmt.Sprintf("%x", md5.Sum(data))
  1. 写响应代码 主要是转换response body,用到上课提到的办法 image.png

  2. 结果

image.png

3

在2的基础上实现并行

首先想到直接加go 关键字,发现没有输出,想到应该用channel来通信,实现上用的无缓冲channel,实现接收和发送的同步,最后对两个api的请求结果用select实现读取channel

结果 image.png

百度翻译平台,调用了48个字符

image.png

总结

是有收获的一天