Go语言实战学习笔记

92 阅读2分钟

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,翻译用户需要的内容。

学习两个方便好用的网站,

oktools.net/

可以快速将json转化对应语言结构体。

curlconverter.com/#go

可以将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连接。