os.Pipe()的阻塞问题
我在看go并发编程的时候说管道是阻塞的,必须并发读写,可是我顺序执行也没什么问题,为什么? 函数 "bufio" "io" "os" "strconv" "sort" ) func readValues(infile string) (values []int,err error){ file,err := os.Open(infile) if err != nil { fmt.Println("打开文件失败!",infile) } defer file.Close() br := bufio.NewReader(file) values = make(...阅读全文
不同的并行协程之间交流的方式有两种,一种是通过共享变量,另一种是通过队列。Go 语言鼓励使用队列的形式来交流,它单独为协程之间的队列数据交流定制了特殊的语法 —— 通道。通道是协程的输入和输出。作为协程的输出,通道是一个容器,它可以容纳数据。作为协程的输入,通道是一个生产者,它可以向协程提供数据。通道作为容器是有限定大小的,满了就写不进去,空了就读不出来。通道还有它自己的类型,它可以限定进入通道的数据的类型。图片创建通道创建通道只有一种语法,那就是 make 全局函数,提供第一个类型参数限定通道可以容纳的数据类型,再提供第二个整数参数作为通道的容器大小。大小参数是可选的,如果不填,那这个通道的容量为零,叫着「非缓冲型通道」,非缓冲型通道必须确保有协程正在尝试读取当前通道,否则写操作就会阻塞直...阅读全文
读写文件要用到os包中的 func OpenFile(name string, flag int, perm FileMode) (*File, error) 该方法第一个参数为文件路径,第二个参数控制文件的打开方式,第三个参数控制文件模式 可用的打开方式有 const ( //只读模式 O_RDONLY int = syscall.O_RDONLY // open the file read-only. //只写模式 O_WRONLY int = syscall.O_WRONLY // open the file write-only. //可读可写 O_RDWR int = syscall.O_RDWR // open the file read-write. //追加内容 O_APPE...阅读全文
在关系型数据库领域,为人津津乐道的一个特性,便是数据库的锁设计及事务隔离级别。 本文通过golang系统库sync,来实现简单的数据库数据读写操作。 场景说明 小明经营一家水果店,创业初始资金为100000元,所有的收入以及支出通过2个银行账户进行往来。 因交易频繁,可能存在并发更新账户数据及查账的需求,需要保障账户数据针对所有操作的一致性。 此处需要引入读写锁,保障读写的安全性及高效性。 需求分析 在MySQL中,使用InnoDB存储引擎,配合合适的事务隔离级别,可以做到数据行级锁定,也就是: 操作类型 查账户A 查账户B 写账户A 写账户B 查账户A 可并发 可并发 互斥 可并发 查账户B 可并发 可并发 可并发 互斥 写账户A 互斥 可并发 互斥 可并发 写账户B 可并发 互斥 可并发...阅读全文
因为golang的map和列表切片都是引用类型,且非线程安全的,所以在多个go routine中进行读写操作的时候,会产生“map read and map write“的panic错误。 某一些类型的对象,会有这种类似的set方法来写数据,或者get方法来返回一个map: func (this *object) Set(name, val) { this.Lock() defer this.Unlock() this.m[name] = val } func (this *object) Get() map[string]string { this.Lock() defer this.Unlock() return this.m } 如果会在多个go routine中通过该对象的Get()...阅读全文
名词解释 nil channel:未初始化的channel,即没有执行make操作 closed channel:执行了closed操作的channel 读写结果 对这两种特殊channel执行读写操作会发生什么呢? 对nil channel的读写会永久block 向closed channel写入会发生panic 从closed channel读取会立即读出零...阅读全文
```go func main() { f4() } func f4() { m := make(map[string]int) var lock sync.RWMutex go func(m map[string]int, l sync.RWMutex) { for { time.Sleep(time.Second * 1) l.RLock() fmt.Println("token now is : ", m["a"]) l.RUnlock() } }(m, lock) for { time.Sleep(time.Nanosecond * 1) lock.Lock() m["a"] = rand.Int() lock.Unlock() } } ``` 讲道理没啥问题呀,怎么还会报读写冲突呢...阅读全文
同时用多种语言开发前后端、移动端难免会混乱记不清API,所以golang开发中遇到的小问题都会慢慢在此笔记中添加。 文件和目录操作 得到当前程序的运行目录 if dir, err := filepath.Abs(filepath.Dir(os.Args[0])); err == nil { } 使用go run 运行的程序的路径是在一个临时目录中。 使用go build得到的可执行文件运行才会得到真正的当前目录。 创建目录 //创建目录 os.Mkdir(dir, os.ModeDir) //创建多级目录 os.MkdirAll(dir, os.ModePerm) 写文件 //简单的写文件API。必须添加os.ModePerm,否则在mac中双击打开文件时会提示没有权限, //显示简介中可以...阅读全文
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangshubo1989/article/details/74777112 生命不止,继续 go go go !!! 读写文件应该是在开发过程中经常遇到的,今天要跟大家一起分享的就是在golang的世界中,如何读写文件。 使用io/ioutil进行读写文件 先回忆下之前的ioutil包介绍: Go语言学习之ioutil包(The way to go) 其中提到了两个方法: func ReadFile func ReadFile(filename string) ([]byte, error) ReadFile reads the file named by filename and retur...阅读全文
创建文件通过os包的Create、NewFile方法创建func Create(name string)(file *File,err Error)func NewFile(fd uintprt,name string)*File打开文件func Open(name string)(file *File,err Error)func OpenFile(name string,flag int,perm uint32)(file *File,err Error)写文件func (file *File) Write(b []byte)(n int,err Error)func (file *File)WriteAt(b []byte,off int64)(n int,err Error)func...阅读全文
golang_real.jpg select是Go中的一个控制结构,类似于switch语句,用于处理异步IO操作。select会监听case语句中channel的读写操作,当case中channel读写操作为非阻塞状态(即能读写)时,将会触发相应的动作。 func main(){ c1 := make(chan string) c2 := make(chan string) go func(){ time.Sleep(1 * time.Second) c1 <- "one" }() go func(){ time.Sleep( 2 * time.Second) c2 <- "two" }() for i:= 0; i < 2; i++ { select { case msg1 := <- c...阅读全文
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangshubo1989/article/details/74777112 生命不止,继续 go go go !!! 读写文件应该是在开发过程中经常遇到的,今天要跟大家一起分享的就是在golang的世界中,如何读写文件。 使用io/ioutil进行读写文件 先回忆下之前的ioutil包介绍: Go语言学习之ioutil包(The way to go) 其中提到了两个方法: func ReadFile func ReadFile(filename string) ([]byte, error) ReadFile reads the file named by filename and retur...阅读全文
官方定义 每个case都必须是一个通信 所有channel表达式都会被求值 所有被发送的表达式都会被求值 如果任意某个通信可以进行,它就执行;其他被忽略。 如果有多个case都可以运行,Select会随机公平地选出一个执行。其他不会执行。否则,如果有default子句,则执行该语句;如果没有default字句,select将阻塞,直到某个通信可以运行;Go不会重新对channel或值进行求值。 举例说明 下面针对官方的定义,我们结合例子看一下。 首先,列举一下select语句中,case会出现的操作: channel操作 case中为channel操作时,select用来监听和channel有关的IO操作。示例-1中若ch1和ch2有读写操作,就会触发执行case中的代码。 若ch1和ch2...阅读全文