实战
用于处理输入输出流
引入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对象,即发送到客户端。