这是我参与的「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。
今天参与了第三届青训营后端场的第一次课,讲师使用三个小实践掉我们领略了golang的魅力,下面给大家介绍这三个小实践,希望能对初学者有一定帮助。
实践一 猜数游戏
相信大家在学习一门计算机编程语言的过程中或多或少都完成过这个猜数游戏的编程,具体实现我就不在赘述了,直接看代码。
func main() {
maxNum := 100
rand.Seed(time.Now().UnixNano() //使用随机种子生成随机数
secretNumber := rand.Intn(maxNum)
// fmt.Println("The secret number is ", secretNumber)
fmt.Println("Please input your guess")
reader := bufio.NewReader(os.Stdin)
for {
input, err := reader.ReadString('\n')
if err != nil {
fmt.Println("An error occured while reading input. Please try again", err)
continue
}
input = strings.TrimSuffix(input, "\r\n")
guess, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer value")
continue
}
fmt.Println("You guess is", guess)
if guess > secretNumber {
fmt.Println("Your guess is bigger than the secret number. Please try again")
} else if guess < secretNumber {
fmt.Println("Your guess is smaller than the secret number. Please try again")
} else {
fmt.Println("Correct, you Legend!")
break
}
}
}
实践一 扩展(通过fmt.scanf()读取)
对于刚学go语言的同学来说,使用bufio和reder等内置函数来读取控制台的输入可能比较复杂,因为里面涉及到一些数据类型的转换和内置函数的调用。所以直接使用fmt包中的scanf()函数更便于理解和使用。
注意:在使用scanf()替换上面的读取方法时,需要将控制台的换行符也读取,否则会造成一次输入造成两次输出的结果。
实践二 命令行单词翻译
在控制台使用命令行运行函数时加上需要翻译的单词作为命令行的参数,得到单词的相关翻译。
本实践的重点就是发起对翻译网站的api请求和对各种数据的读取和转换。
在开始之间介绍两个需要使用的网站
- curlconverter.com/#go //根据post请求构建出相应的go语言代码
- oktools.net/json2go //json转golang结构体
下面以彩云小译为例:
- 抓包:获取post请求构建golang代码
- 使用上面介绍的第一个网站curlconverter.com/#go 转换。
- 使用oktools.net/json2go 来构建网络响应的结构体
- 将结构体映射到自己构建的结构体中,由于结构体内容太多,我就不上代码了。
var dictResponse DictResponse
err = json.Unmarshal(bodyText, &dictResponse) //将得到的结果解码并映射到自己通过json转码工具构造的struct中
if err != nil {
log.Fatal(err)
}
fmt.Println(word, "UK: ", dictResponse.Dictionary.Prons.En, "US: ", dictResponse.Dictionary.Prons.EnUs)
for _, item := range dictResponse.Dictionary.Explanations {
fmt.Println(item)
}
实践三 sockes5代理
第三个实践比较复杂,涉及到代码量也要比之前的两个实践要多。
首先介绍一下原理
这里面主要涉及3个函数
- process() 主要是处理连接
- auth() 主要是一个鉴权的作用
- connect() 主要是发起请求
由于比较复杂,我这里不在详细的讲解,有兴趣的同学可以去看看源码 github.com/wangkechun/…