GO语言实战案例

98 阅读3分钟

1. 猜谜游戏

虽然老师的每次都一样需要设置随机数种子,但我的版本下不需要设置

package main  
  
import (  
"fmt"  
"math/rand"  
)  
  
func main() {  
maxNum := 100  
secretNumber := rand.Intn(maxNum)  
fmt.Println("The secret number is ", secretNumber)  
}

考察输入输出和循环判断

package main

import (
	"bufio"
	"fmt"
	"math/rand"
	"os"
	"strconv"
	"strings"
)

func main() {
	//生成一个小于100 的随机数
	maxNum := 100
	secretNumber := rand.Intn(maxNum)
	fmt.Println("The secret number is ", secretNumber)

	for {
		//让用户输入一个数字
		fmt.Println("Please input your guess")
		reader := bufio.NewReader(os.Stdin)
		input, err := reader.ReadString('\n')
		if err != nil {
			fmt.Println("输入错误,重新输入", err)
			return
		}
		input = strings.TrimSuffix(input, "\r\n") //修剪前后缀

		guess, err := strconv.Atoi(input) //转换为int类型的guess
		if err != nil {
			fmt.Println("输入格式错误,重新输入", err)
			return
		}
		fmt.Println("你的猜想是", guess)

		if guess < secretNumber {
			fmt.Println("你输入的数字小了")
		} else if guess > secretNumber {
			fmt.Println("你输入的数字大了")
		} else {
			fmt.Println("你输入的数字正确")
			break
		}
	}

}

2. 在线词典

用go语言发送http请求

curl 'https://api.interpreter.caiyunai.com/v1/dict' \
  -H 'authority: api.interpreter.caiyunai.com' \
  -H 'accept: application/json, text/plain, */*' \
  -H 'accept-language: zh-CN,zh;q=0.9' \
  -H 'app-name: xy' \
  -H 'content-type: application/json;charset=UTF-8' \
  -H 'device-id: eb5a954fac3594d53454ea4feb0a26bc' \
  -H 'origin: https://fanyi.caiyunapp.com' \
  -H 'os-type: web' \
  -H 'os-version;' \
  -H 'referer: https://fanyi.caiyunapp.com/' \
  -H 'sec-ch-ua: "Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "Windows"' \
  -H 'sec-fetch-dest: empty' \
  -H 'sec-fetch-mode: cors' \
  -H 'sec-fetch-site: cross-site' \
  -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36' \
  -H 'x-authorization: token:qgemv4jr1y38jyq6vhvi' \
  --data-raw '{"trans_type":"zh2en","source":"你好"}' \
  --compressed

代码生成网站: https://curlconverter.com/ 生成go代码:

package main import ( "fmt" "io" "log" "net/http" "strings" ) func main() { client := &http.Client{} var data = strings.NewReader(`{"trans_type":"zh2en","source":"你好"}`) req, err := http.NewRequest("POST", "https://api.interpreter.caiyunai.com/v1/dict", data) if err != nil { log.Fatal(err) } req.Header.Set("authority", "api.interpreter.caiyunai.com") req.Header.Set("accept", "application/json, text/plain, */*") req.Header.Set("accept-language", "zh-CN,zh;q=0.9") req.Header.Set("app-name", "xy") req.Header.Set("content-type", "application/json;charset=UTF-8") req.Header.Set("device-id", "eb5a954fac3594d53454ea4feb0a26bc") req.Header.Set("origin", "https://fanyi.caiyunapp.com") req.Header.Set("os-type", "web") req.Header.Set("os-version", "") req.Header.Set("referer", "https://fanyi.caiyunapp.com/") req.Header.Set("sec-ch-ua", `"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"`) req.Header.Set("sec-ch-ua-mobile", "?0") req.Header.Set("sec-ch-ua-platform", `"Windows"`) req.Header.Set("sec-fetch-dest", "empty") req.Header.Set("sec-fetch-mode", "cors") req.Header.Set("sec-fetch-site", "cross-site") req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36") req.Header.Set("x-authorization", "token:qgemv4jr1y38jyq6vhvi") resp, err := client.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close() bodyText, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Printf("%s\n", bodyText) }

SOCKS5代理

原理:

TCP echo

package main // 声明包名为 main

import (
	"bufio" // 导入 bufio 包,用于读写数据
	"fmt"
	"log" // 导入 log 包,用于记录日志
	"net" // 导入 net 包,用于网络编程
)

func main() {
	server, err := net.Listen("tcp", "127.0.0.1:1080") // 监听本地 1080 端口的 TCP 连接
	if err != nil {                                    // 如果监听失败,则抛出异常并终止程序运行
		panic(err)
	}
	for { // 循环等待客户端连接
		client, err := server.Accept() // 接受客户端连接请求,并返回一个新的连接对象和错误信息
		if err != nil {                // 如果接受连接失败,则记录日志并继续等待下一个连接请求
			log.Println("Accept failed %v", err)
			continue
		}
		go process(client) // 启动一个新的 goroutine 处理客户端连接请求
	}

}

func process(conn net.Conn) {
	defer conn.Close()              // 在函数结束时关闭连接对象,确保资源被释放
	reader := bufio.NewReader(conn) // 创建一个带缓冲的读取器对象,从连接中读取数据
	for {                           // 循环读取客户端发送的数据,并将其原样返回给客户端
		b, err := reader.ReadByte()
		if err != nil {
			break // 如果读取数据失败,则跳出循环并关闭连接
		}
		fmt.Println(b)
		_, err = conn.Write([]byte{b}) // 将读取到的数据写回客户端
		if err != nil {
			break // 如果写入数据失败,则跳出循环并关闭连接
		}
	}

}

在cmd中运行: 结果:

(base) PS E:\temp\gotest> nc 127.0.0.1 1080
jlkdasjfklkldas
jlkdasjfklkldas