Golang中如何实现同步IO?代码举例讲解

在Golang中,可以直接使用net/http包提供的标准HTTP服务来实现同步IO。

代码示例:

同步TCP服务器:

go
func main() {
    http.HandleFunc("/", handleRequest)
    http.ListenAndServe(":8000", nil)
}

func handleRequest(w http.ResponseWriter, r *http.Request) {
    conn, _, err := w.(http.Hijacker).Hijack() 
    if err != nil {
        log.Fatal(err)
    }

    // 处理连接,阻塞等待响应
    handleConnection(conn) 
}

func handleConnection(conn net.Conn) { 
    // ...
    buf := make([]byte, 512)
    conn.Read(buf)
    conn.Write(buf)
    // ...
}

服务器在handleRequest函数中获取 underlying TCP 连接,然后阻塞调用handleConnection进行处理,等待响应返回后才释放连接,继续处理其他请求。这就是典型的同步阻塞IO。

同步TCP客户端:

go
conn, err := net.Dial("tcp", "localhost:8000")
if err != nil {
    log.Fatal(err)
}

// 发送请求,阻塞等待响应
_, err = conn.Write([]byte("data")) 
if err != nil {
    log.Fatal(err) 
}

// 阻塞读取响应
buf := make([]byte, 512)
_, err = conn.Read(buf)
if err != nil {
    log.Fatal(err) 
}

客户端在写请求和读取响应时,都采用阻塞调用,首先等待上一步操作完成后才继续执行下一步,这同样实现了同步IO。