golang中单向channel的语法介绍

本文主要给大家介绍的是关于golang单向channel语法的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍:

今天闲来无事补充一下golang的语法知识,想起来看看context的用法,结果碰到了一个没见过的channel语法:

// A Context carries a deadline, cancelation signal, and request-scoped values
// across API boundaries. Its methods are safe for simultaneous use by multiple
// goroutines.
type Context interface {
 // Done returns a channel that is closed when this `Context` is canceled
 // or times out.
 Done() <-chan struct{}

 // Err indicates why this Context was canceled, after the Done channel
 // is closed.
 Err() error

 // Deadline returns the time when this Context will be canceled, if any.
 Deadline() (deadline time.Time, ok bool)

 // Value returns the value associated with key or nil if none.
 Value(key interface{}) interface{}
}

注意看:Done() <- chan struct{} ,一个接口函数的声明怎么这么奇怪呢?下面来分解一下。

Done() chan struct{} :如果函数定义改成这样,其意义是,

  • 函数名Done,参数(),返回值chan struct{}
  • 单独拿返回值来说,它是一个管道chan,内部的数据类型是struct{}
  • 单独拿struct{}来说,我们熟悉type Name struct{a int, b bool}这样去定义一个结构体的类型,其实struct{…}就是定义结构体,和map[string]int这种定义是一样的,type只是给它启了一个别名。

<- chan struct{} :单独看这个表达式,我们知道如果ch := make(chan struct{}) ,那么<- ch是从管道里取出数据。但是chan struct{}是类型而不是变量,竟然能从一个类型里取数据??

其实<-chan int仍旧是一个管道类型,它叫做单向channel。如果是<-chan int,说明是只能读不能写的管道(也不能关闭),如果是chan <- int ,说明是只能写不能读的管道(可以关闭),仅此而已!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用Go语言能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

时间: 2017-07-26

golang判断chan channel是否关闭的方法

本文实例讲述了golang判断chan channel是否关闭的方法.分享给大家供大家参考,具体如下: 群里有朋友问,怎么判断chan是否关闭,因为close的channel不会阻塞,并返回类型的nil值,会导致死循环.在这里写个例子记录一下,并且分享给大家 如果不判断chan是否关闭 Notice: 以下代码会产生死循环 复制代码 代码如下: package main import (     "fmt" ) func main() {     c := make(chan int,

Go语言中使用 buffered channel 实现线程安全的 pool

概述 我们已经知道 Go 语言提供了 sync.Pool,但是做的不怎么好,所以有必要自己来实现一个 pool. 给我看代码: 复制代码 代码如下: type Pool struct {   pool chan *Client } // 创建一个新的 pool func NewPool(max int) *Pool {   return &Pool{     pool: make(chan *Client, max),   } } // 从 pool 里借一个 Client func (p *P

Go语言的管道Channel用法实例

本文实例讲述了Go语言的管道Channel用法.分享给大家供大家参考.具体分析如下: channel 是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值. ch <- v // 将 v 送入 channel ch. v := <-ch // 从 ch 接收,并且赋值给 v. ("箭头"就是数据流的方向.) 和 map 与 slice 一样,channel 使用前必须创建: ch := make(chan int) 默认情况下,在另一端准备好之前,

Golang中channel使用的一些小技巧

关闭2次 复制代码 代码如下: ch := make(chan bool) close(ch) close(ch)  // 这样会panic的,channel不能close两次 读取的时候channel提前关闭了 复制代码 代码如下: ch := make(chan string) close(ch) i := <- ch // 不会panic, i读取到的值是空 "",  如果channel是bool的,那么读取到的是false 向已经关闭的channel写数据 复制代码 代码

go语言channel实现多核并行化运行的方法

本文实例讲述了go语言channel实现多核并行化运行的方法.分享给大家供大家参考.具体如下: 这里定义一个Add函数,用于返回两个整数的和,使用go 语句进行并行化运算,为了等待各个并行运算结束获得其返回值,需要引入channel 复制代码 代码如下: package main import "fmt" func Add(x int,y int,channel chan int) {     sum := library.Add(x,y)     fmt.Println(sum)  

Sublime Text 3 实现C语言代码的编译和运行(示例讲解)

Sublime Text 3是一款优秀的代码编辑软件.界面简洁,轻巧快速,很受大家的欢迎. 最近开始用他来编辑数据结构的代码,这就需要在新建编译系统. 具体方法如下: 首先: 接下来是关键的一步,将以下代码粘贴到弹出的编辑页面中,文件名为name.sublime-build形式,name是新建的编译器名字. { "cmd": ["gcc","${file}","-fexec-charset=gbk","-o"

c语言中字符串分割函数及实现方法

1.问题引入 自己在写一个linux下的模拟执行指令的时候,遇到了输入"cat a.c",要将该字符串分解成cat和a.c两个单独的字符串,虽然知道有strtok的存在,但是想自己尝试写一下,于是就自己写了一个,不过总是遇到这样或那样的问题,虽然最后调通了,不过确浪费了不少时间:后来作业交上去以后又仔细阅读了strtok函数,发现原来linux下已经改成strsep,所有在这里就写一下自己所走的过程. 2.自己写的字符串分割函数:用于分割指令,比如cat a.c最后会被分割成cat和a

解析crontab php自动运行的方法

crontab是linux自带的一个命令  使php自动运行的方法php自动运行有很多方法,这里分以下DZ以及一些通过系统完成的方法和直接触发运行驻留系统的方法.Discuz后台有个计划任务,可以使php自动运行.DZ计划任务的机制是这样:1.首先在到了触发计划任务的时间,有访问(会员,游客,搜索引擎的蜘蛛)然后触发该计划任务发生.(因为PHP是触发是语言,没有人去访问他,他什么也做不了.)2. 计划任务执行.3. 执行成功,返回执行成功的信息,更新到数据库中记录当前执行的时间,下一次需要执行的

Go语言判断指定文件是否存在的方法

本文实例讲述了Go语言判断指定文件是否存在的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main    import (     "fmt"     "os" )    func main() {     f, err := os.Open("dotcoo.com.txt")     if err != nil && os.IsNotExist(err) {         fmt.Pri

Go语言对字符串进行MD5加密的方法

本文实例讲述了Go语言对字符串进行MD5加密的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (     "crypto/md5"     "fmt"     "io" ) func main() {     h := md5.New()     io.WriteString(h, "welcome to jb51.net")     fmt.Printf(&quo

Go语言通过http抓取网页的方法

本文实例讲述了Go语言通过http抓取网页的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (  "fmt"  "log"  "net/http"  "net/url"  "io/ioutil" ) //指定代理ip func getTransportFieldURL(proxy_addr *string) (transport *http.Tr

Go语言用map实现堆栈功能的方法

本文实例讲述了Go语言用map实现堆栈功能的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package stack import (     "strconv" ) type Stack struct {     quenu map[int]int } func New() *Stack{     s := new(Stack)     s.quenu = make(map[int]int)     return s } func (s *Stack) Pus

go语言通过odbc操作Access数据库的方法

本文实例讲述了go语言通过odbc操作Access数据库的方法.分享给大家供大家参考.具体如下: 这里需要用到go-odbc库,下载地址为:https://github.com/weigj/go-odbc 复制代码 代码如下: package main; import (  "fmt"  "database/sql"  _"odbc/driver" ) func main(){  conn,err := sql.Open("odbc&q

Go语言图片处理和生成缩略图的方法

本文实例讲述了Go语言图片处理和生成缩略图的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (     "fmt"     "os"     "image"     "image/color"     "image/draw"     "image/jpeg" ) func main() {     f1, err := os