这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天,70多分钟快速入门了下Go语言,课程一:简要介绍了语法,包括for、switch和其他语言的不同,以及map、切片等常用的数据结构;课程二:主要是三个例子:猜数、翻译单词、socks5实现。
封面来自于go.dev/blog/gopher
课程一
语法概述,主要记录下和其他语言的不同点
Go特点
高性能高并发,带GC,标准库丰富
语法
- 变量
两种形式a := float64(2.71)或者var a = float64(2.71) - 控制\
- if:写法
if a < b {}条件没有小括号,语句必须写在大括号里边 - for:条件没有括号
- 没有常见的while, 可直接
for {}+break来代替 - switch:case默认有break,switch 也可以不加条件,case一个一个判断
- range遍历
数组:for index, num := range xxxmap:for key, val := range xxx - 结构体及结构体函数
type xxx struct{}
func (x xxx) funname(){}
- 字符串格式化
"%v"任意打印,"%+v"详细信息 - 切片
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))
- 数组
声明数组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函数相应的位置
- 平台注册
- postman测试
用postman请求接口测试
- 写请求代码
与上课内容类似,也是写一个结构体,注意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))
-
写响应代码 主要是转换response body,用到上课提到的办法
-
结果
3
在2的基础上实现并行
首先想到直接加go 关键字,发现没有输出,想到应该用channel来通信,实现上用的无缓冲channel,实现接收和发送的同步,最后对两个api的请求结果用select实现读取channel
结果
百度翻译平台,调用了48个字符
总结
是有收获的一天