c语言编程笔录

首页 >   > 笔记大全

笔记大全

Go语言中的文件系统 多线程 信号处理

更新时间:2023-10-22

文件系统

Go语言中文件系统相关的操作主要是通过 "os" 和 "io/ioutil" 两个库来实现的。其中,“os”包提供了接近操作系统原生的文件操作API,适合底层文件操作。 "io/ioutil" 则是对 "os" 进行了轻量级封装,提供了更简单的方式进行文件操作。 下面是一个简单的使用 "os" 包进行文件读写操作的示例:
import (
    "fmt"
    "os"
)

func main() {
    // 打开文件
    file, err := os.Open("test.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    // 读取文件内容
    buffer := make([]byte, 1024)
    for {
        n, err := file.Read(buffer)
        if err != nil && err != io.EOF {
            panic(err)
        }
        if n == 0 {
            break
        }
        fmt.Println(string(buffer[:n]))
    }
}
这个示例中,我们打开一个名为 "test.txt" 的文件并读取了它的内容。虽然这个例子仅仅是展示了"读取"一个文件的示例,但使用相同的方法,也可以执行文件的创建、写入和删除等操作。

多线程

Go语言原生支持并发编程,提供了轻松调度goroutine的API,并且可以无缝地管理它们。goroutine 是一种轻量级线程,可以有效地帮助实现并发。在Go中,一个程序只需要一个主线程,然后可以创建多个goroutine执行任务。 下面是一个使用goroutine实现的并发程序的示例:
import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    for i := 1; i <= 10; i++ {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            fmt.Println("goroutine ", i)
        }(i)
    }
    wg.Wait()
}
在这个示例中,我们循环创建了10个goroutine并打印它们的ID,使用sync.WaitGroup来任务同步,保证所有的goroutine都执行完毕后再结束程序。

信号处理

Go原生提供了对进程信号的处理,通过使用Signal包可以捕获和处理进程收到的信号。Signal包实现了一个简单的接口,用来捕获和处理OS信号。 下面是一个简单的示例程序,展示如何在Go中监听和处理进程终止信号:
import (
    "fmt"
    "os"
    "os/signal"
    "syscall"
)

func main() {
    sigs := make(chan os.Signal, 1)
    done := make(chan bool, 1)

    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        sig := <-sigs
        fmt.Println()
        fmt.Println(sig)
        done <- true
    }()

    fmt.Println("开始监听进程信号...")
    <-done
    fmt.Println("程序即将退出...")
}
这个示例中,我们使用Signal.Notify()方法来注册要捕获的进程信号。在goroutine中监听并处理信号,一旦接受到监听到的信号就执行goroutine并退出打印相应的信号,让主程序退出。

总结

Go语言通过标准库提供了非常丰富的API来实现文件系统、多线程、信号处理等功能,从底层支持了并发编程。这使得Go语言在轻量级网络应用、云服务等领域得到了广泛应用。同时,由于它的高效和轻量级特性,在大数据和高并发场景中也有很好的表现。