Go语言实战学习笔记
实战一:猜数字
这也算各个语言学习中除了hello world以外最早的学习案例了。一般而言通过学习该案例可以了解到一门语言简单的输入输出方法、随机数生成、if语句和循环语句的原理。
package main
import (
"fmt"
"math/rand"
)
func main() {
maxNum := 100
secretNumber := rand.Intn(maxNum)
fmt.Println("The secret number is ", secretNumber)
}
由教学可知,go语言的编程前需要先导入相关的库,此时这里导入了fmt有关输入输出的库,以及math/rand有关随机数的库。 一般而言,go语言使用
var 变量名 变量类型 = 变量的值
或者
变量名 := 变量的值
对变量进行声明和赋值,go会自己推导变量类型,也可以像第一种方法自己对变量进行声明。
这里声明了maxNum变量,赋值为100,即表明随机数上限。
下一行即生成了一个随机数secretNumber,使用了math/rand中的函数,rand.Intn生成一个类型为int,上限为100的随机数。
最后使用fmt库中的Println方法来输出该随机数。
该代码仅是最基础的部分仅包括随机数部分,还缺少猜数字部分。下面代码展示全部功能。
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"strings"
"time"
)
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.Trim(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
}
}
}
完善的代码中包括时间戳保证随机数不固定。使用输入流获取用户输入信息,转化为数字,用于与生成的随机数比较。
这其中包括流的处理,变量类型的转换,以及错误的判断与处理。
最终,通过循环,保证程序正常运行,用户可以得到提示,猜到数字。
实战二:在线词典
该案例中,我们将学习http、json相关方法函数,通过调用第三方翻译api,翻译用户需要的内容。
学习两个方便好用的网站,
可以快速将json转化对应语言结构体。
可以将curl转化为对应语言代码。
调用http的接口翻译,使用结构体转换json的方法进行输入输出。
实战三:socket5代理服务器
第一步,实现一个返回输入的server。
第二步,实现代理服务器与浏览器的认证阶段。
包括了版本号,认证方法数量和具体的认证方法编号,最终选取了无需认证的方法。
第三步,实现请求阶段。
实现了如下信息的交互
// VER 版本号,socks5的值为0x05
// CMD 0x01表示CONNECT请求
// RSV 保留字段,值为0x00
// ATYP 目标地址类型,DST.ADDR的数据对应这个字段的类型。
// 0x01表示IPv4地址,DST.ADDR为4个字节
// 0x03表示域名,DST.ADDR是一个可变长度的域名
// DST.ADDR 一个可变长度的值
// DST.PORT 目标端口,固定2个字节
第四步,建立TCP连接。