[go实战 | 青训营笔记]

74 阅读2分钟
title: go实战
date: 2023-5-13

猜谜游戏

1、生成随机数

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

当使用100来作为随机数种子时,随机数将固定不变,所以可以使用时间戳来初始化随机数种子

func main() {
    maxNum := 100
    rand.Seed(time.Now().UnixNano())
    secretNumber := rand.Intn(maxNum)
    println("The secret number is ", secretNumber)
}

2、读取用户输入

func main(){
    // 读取一行
    reader := bufio.NewReader(os.Stdin)
    input, err := reader.ReadString('\n')
    if err != nil {
        fmt.Println("An error occured while reading input. Please try again", err)
        return
    }
    // 将换行符去除
    input = strings.Trim(input, "\r\n")
    // 将字符串转换为数字
    guess, err := strconv.Atoi(input)
    if err != nil {
        fmt.Println("Invalid input. Please enter an integer value")
        return
    }
    fmt.Println("You guess is", guess)
}

3、实现游戏循环

使用for循环在数字不匹配或出错时,继续循环;在数字匹配时,退出循环;

image-20230513214504086

在线词典

1、抓包

当点击翻译时,会发送一个POST请求

image-20230513215635317

image-20230513215604281

image-20230513215558254

2、构建请求

image-20230513215857721

image-20230513215943799

3、构造结构体,解析Json

在发送请求后,会得到一段Json格式的内容,因此,需要构造一个结构体来对这段内容进行解析

image-20230513220928876

image-20230513221133108

解析出来的大部分是不需要的,可以通过筛选需要的字段,来进行显示

fmt.Println(word, "UK:", dictResponse.Dictionary.Prons.En, "US:", dictResponse.Dictionary.Prons.EnUs)
for _, item := range dictResponse.Dictionary.Explanations {
    fmt.Println(item)
}

Socks5代理

SOCKS5是代理协议,在使用TCP/IP协议通信的前端机器和服务器之间发挥中介作用,内部网络的前端机器可以访问互联网的服务器,使通信更加安全

SOCKS是运行在OSI七层协议中的第五层会话层

绕过互联网块 由于代理服务器充当设备和互联网之间的中继,因此它们可以轻松绕过互联网块

更快,更可靠的连接

错误减少,整体性能提升

在P2P平台上表现更好

Socks5代理的原理:

  • 协商阶段:用户浏览器向Socks5服务器发送报文(协议版本号,支持认证的种类),代理服务器选择一个支持的认证方式返回给浏览器
  • 认证阶段
  • 请求阶段:发送请求,之后代理服务器与后端服务器建立TCP连接
  • relay阶段:浏览器正常发送请求,代理服务器将简单地把relay数据发送到服务器上

image-20230513222159473

Version1

实现一个TCP echo server,发送啥,就回复啥。在 main 函数里面,使用 net.Listen 监听端口,监听端口之后返回一个 server。在循环里面使用 server.Accept 接受一个请求。

func main() {
   server, err := net.Listen("tcp", "127.0.0.1:1080")
   if err != nil {
      panic(err)
   }
   for {
      client, err := server.Accept()
      if err != nil {
         log.Printf("Accept failed %v1", err)
         continue
      }
      go process(client)
   }
}

待补充