02go语言实战案例的一些笔记

50 阅读1分钟

猜谜游戏,生成随机数

rand.Intn(num)会生成一个不大于num的随机数

  • 如果直接这样,每次都会生成相同的随机数,想要每次都生成不同的随机数,需要使用随机数种子

  •  rand.Seed(time.Now().UnixNano())
    
    • 这样就用时间作为随机数种子

有缓冲的输入

  • reader := bufio.NewReader(os.Stdin)

对该缓冲区按行进行读操作

  • input, err := reader.ReadString('\n')

去掉字符串的指定后缀

  • strings.TrimSuffix(input, "\n") 此处留意,如果是Windows,input后面接的应该是"\r\n"

Socks5代理服务器

socks5是一个很古老的协议,一些企业搞了很强的防火墙,同样来了麻烦性,socks5就相当于在墙上开了个口子,方便内部员工进入(实际上很多翻墙软件也是最终暴露一些socks5给浏览器端口使用)

使用Socks5的话,整个过程的几个阶段

  • 协商阶段:Client和代理协商好
  • 请求阶段:Client发送请求,代理和Server建立TCP连接
  • 发送数据和返回

server.Accept() 返回的是net.Conn类型

网络协议:所谓协议,就是约定好,先发什么,后法什么,接收方就知道,哦,我接收到的第一个数,要当作版本处理,我接收的第二个数,要当作长度处理

一个读取的方式

先定义一个固定长度的缓冲区,然后用io.ReadFull(reader,buf)来读满