作者文章

fwq

FWQ
Docker教程
GO中new 和 make的区别
一、make make 只能为 slice、map或 channel 类型分配内存并初始化,同时返回一个有初始值的 slice、map 或 channel 类型引用,不是指针。   通过下表再来看 make 的具体应用: Call Type T Result make(T, n) slice slice of type T with length n…
2024-11-18 阅读全文 →
FWQ
Docker教程
Go中的os包之目录和文件(file)的操作
go中对文件和目录的操作主要集中在os包中,下面对go中用到的对文件和目录的操作,做一个总结笔记。在go中的文件和目录涉及到两种类型,一个是 type File struct,另一个是type Fileinfo interface,来看下这两种类型的定义:   一、 type File struct 的定义 type File struct { *file // os specific } type file struct { fd int name…
2024-11-18 阅读全文 →
FWQ
Docker教程
Go新建文件权限与设置不符
问题: fileName := "/Users/my/tests/perm_file" f, _ := os.OpenFile(fileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666) f.Close() 上述代码是打开一个文件,如果文件不存在则创建一个新文件,同时权限设置为0666(-rw-rw-rw-),但实际生成的文件权限可能与你认为的不一致:   # ll perm_file -rw-r--r--  1 my  staff  0  1 12 16:06 perm_file 这个跟umask值相关,下面说明下umask 功能说明:指定在建立文件时预设的权限掩码。 语  法:umask…
2024-11-18 阅读全文 →
FWQ
Docker教程
Goroutine和channel的详细理解(一)
如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人。 Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库 来新建线程,还要用线程安全的队列库来共享数据。 以下是我入门的学习笔记。   一、Go语言的goroutines、信道和死锁 1. goroutine Go语言中有个概念叫做goroutine, 这类似我们熟知的线程,但是更轻。 以下的程序,我们串行地去执行两次loop函数: func loop() {     for i := 0; i < 10; i++ {         fmt.Printf("%d ", i)…
2024-11-18 阅读全文 →
FWQ
Docker教程
Goroutine和channel的详细理解(三)
Go语言并发的设计模式和应用场景 以下设计模式和应用场景来自Google IO上的关于Goroutine的PPT:https://talks.golang.org/2012/concurrency.slide 本文的示例代码在: https://github.com/hit9/Go-patterns-with-channel 生成器 在Python中我们可以使用yield关键字来让一个函数成为生成器,在Go中我们可以使用信道来制造生成器(一种lazy load类似的东西)。当然我们的信道并不是简单的做阻塞主线的功能来使用的哦。 下面是一个制作自增整数生成器的例子,直到主线向信道索要数据,我们才添加数据到信道 func xrange() chan int{ // xrange用来生成自增的整数     var ch chan int = make(chan int)     go func() { // 开出一个goroutine…
2024-11-18 阅读全文 →
FWQ
Docker教程
Goroutine Channel Select 的用法和理解
Goroutine的使用 Goroutine 奉行通过通信来共享内存,而不是共享内存来通信。使用goroutine很简单,只需要用到一个关键字go,我们用一段代码来示例一下如何使用go关键字   package main import (     "fmt" ) func main() {     go Goroutine() } func Goroutine() {     fmt.Println("Goroutine") } 没有输出?执行了上面的代码后,你会发现,什么都没有输出,那么是什么问题呢? 因为我们当前的程序,只是一个单线程的程序,main函数只要执行完毕后,就不会再管其他线程在做什么事情了,程序自动退出。 然后我们想到了一个办法,加一个sleep函数,让main函数等待Goroutine函数执行完毕后再退出。 更改后的代码如下:…
2024-11-18 阅读全文 →
FWQ
Docker教程
如何优雅地关闭Go channel
几天前,我写了一篇文章来说明golang中channel的使用规范。在reddit和HN,那篇文章收到了很多赞同,但是我也收到了下面几个关于Go channel设计和规范的批评: 在不能更改channel状态的情况下,没有简单普遍的方式来检查channel是否已经关闭了 关闭已经关闭的channel会导致panic,所以在closer(关闭者)不知道channel是否已经关闭的情况下去关闭channel是很危险的 发送值到已经关闭的channel会导致panic,所以如果sender(发送者)在不知道channel是否已经关闭的情况下去向channel发送值是很危险的   那些批评看起来都很有道理(实际上并没有)。是的,没有一个内置函数可以检查一个channel是否已经关闭。如果你能确定不会向channel发送任何值,那么也确实需要一个简单的方法来检查channel是否已经关闭: package main import "fmt" type T int func IsClosed(ch <-chan T) bool {     select {     case <-ch:         return…
2024-11-18 阅读全文 →
FWQ
服务器教程
linux怎么使用yum
yum 是基于 red hat 和 centos 的 linux 发行版中的包管理工具,用于安装、更新和删除软件包。使用 yum 管理软件包括以下步骤:安装 yum(如果尚未安装)查找软件包(sudo yum search )安装软件包(sudo yum install )更新软件包(sudo yum update)删除软件包(sudo yum remove ) 使用 Yum 在 Linux 中管理软件…
2024-11-18 阅读全文 →