MST

星途 面试题库

面试题:Go中defer与goroutine在资源管理场景下的交互

你正在开发一个基于Go语言的网络服务器程序,在处理每个客户端连接时,你启动了一个goroutine来处理该连接。同时,在处理连接的函数中,你需要使用defer来确保资源(如文件描述符等)的正确关闭。请编写一段代码示例,展示如何正确地在这种场景下使用defer和goroutine,避免资源泄漏和竞争条件。
40.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "net"
)

func handleConnection(conn net.Conn) {
    defer func() {
        if err := conn.Close(); err != nil {
            fmt.Println("Error closing connection:", err)
        }
    }()

    // 处理连接的逻辑,例如读取和写入数据
    // ...
}

func main() {
    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println("Error listening:", err)
        return
    }
    defer func() {
        if err := ln.Close(); err != nil {
            fmt.Println("Error closing listener:", err)
        }
    }()

    for {
        conn, err := ln.Accept()
        if err != nil {
            fmt.Println("Error accepting connection:", err)
            continue
        }
        go handleConnection(conn)
    }
}