GO小实战1 | 青训营

54 阅读2分钟

实战

用于处理输入输出流

引入bufio包 os包

  • bufio.NewReader(os.Stdin):创建一个新的Reader对象,从标准输入读取数据
  • reader.ReadString('\n') : 从Reader对象读取一行字符串到\n为止

引入string包

  • strings.TrimSuffix(s,"\n") :删除s字符串中的后缀"\n"
  • strings.Trim(s,"\r\n"):删除s字符串中前后缀"\r\n"

引入strconv包

  • strconv.Atoi(s) :将s字符串转换成数字

抓包

引入net/http包

  • client := &http.Client{} :创建一个名为client的指针变量,类型为http.Client是Go语言用于发送http请求的客户端
  • req, err := http.NewRequest("请求方法",“URL”,请求主体数据) 创建一个HTTP请求对象req,并制定请求方法地址和数据
  • resp, err := client.Do(req):用于发送HTTP请求,req作为参数,返回一个响应对象和可能的错误
  • resp.StatusCode :状态码
  • defer resp.Body.Close() :resp.Body读取响应内容,Close()关闭响应主题

在线词典

func main() {
	if len(os.Args) != 2 {  //如果参数数量不等于2
		fmt.Fprintf(os.Stderr, `usage: simpleDict WORD
example: simpleDict hello
		`)
		os.Exit(1)  //退出程序
	}
	word := os.Args[1]
	query(word)
}

os.Args是一个字符串切片,包含了命令行参数。当用户在命令行中运行程序时,可以通过在程序名称后面添加参数来传递额外的信息。 例如,如果用户在命令行中运行以下命令:
go run main.g hello
那么os.Args将包含以下内容: ["go","run","main.go","hello"] 其中,os.Args[0]是程序名称,os.Args[1]是第一个参数


socks5代理

简单TCP代理服务器

package main

import (
	"bufio"
	"log"
	"net"
)

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 %v", err)
			continue
		}
		go process(client)
	}
}

func process(conn net.Conn) {
	defer conn.Close()
	reader := bufio.NewReader(conn)
	for {
		b, err := reader.ReadByte()
		if err != nil {
			break
		}
		_, err = conn.Write([]byte{b})
		if err != nil {
			break
		}
	}
}
  •  net.Listen("tcp", "127.0.0.1:1080"): 此函数用于在本地地址127.0.0.1的1080端口上启动一个TCP监听器。

  • server.Accept(): 此函数用于接受来自客户端的连接请求。当有新的客户端连接时,它返回一个代表该连接的net.Conn对象。

  • go process(client): 此语句用于为每个新的客户端连接启动一个新的goroutine,以并发处理多个客户端连接。 

goroutine是go语言中实现并发的主要方式。当你在函数调用前加上go关键字,那么这个函数就会在一个新的goroutine中并发执行。这样,函数会立即返回,而函数和调用者可以并发执行。

  • func process(conn net.Conn) { : net.Conn是一个接口,它代表了网络连接的一个端点。

conn是一个实现了net.Conn接口的对象。在这段代码中它是通过server.Accept()方法获取的,代表了一个客户端到服务器的连接。你可以通过conn对象来读取从客户端发送的数据,或者向客户端发送数据。
例如,reader := bufio.NewReader(conn)创建了一个新的读取器,用于从conn读取数据。conn.Write([]byte{b})则是将一个字节b写入到conn,即发送到客户端。

  •  conn.Write([]byte{b}): 此函数用于将一个字节写入到net.Conn对象,即发送到客户端。