Golang: chan定义问题(7)

通常都是定义读写双向的 chan,定义单向 chan 问题。

专栏的介绍可以参考 《GotchaGolang专栏》,代码可以看《宝库-Gotcha》

通过 只写 chan 传递另一个只读的 chan,怎么写

案例

平常一般是这么声明 chan 的:

12345678910
package main

import "fmt"

func () {

  xChan := make(chan int)

  fmt.Println(len(xChan)); //0}

要声明一个单向的 chan 可以使用这一的方式:大专栏  Golang: chan定义问题(7)p>

12
chan<- float64  // 只写 float64 类型变量 (write-only)<-chan int      // 只读 int 类型变量 (read-only)

传递 chan 变量怎么办?

123
chan<- chan int    //传递双向 chan, 同 chan<- (chan int)chan<- <-chan int  //传递只读 给只写chan, 同 chan<- (<-chan int)<-chan <-chan int  //传递只读chan 给只读chan 同 <-chan (<-chan int)

总结

定义只读,只写的类型,看上去比较诡异,可以把 <-chanchan<- 看做类型即可,同 chan 一样。



Merlin 2018.3 chan 的定义问题

原文地址:https://www.cnblogs.com/lijianming180/p/12251421.html

时间: 2024-11-14 13:23:44

Golang: chan定义问题(7)的相关文章

golang chan 超时

golang chan 超时 Posted on 2013-12-24 13:03 oathleo 阅读(4227) 评论(0)  编辑  收藏 package main import (    "fmt"    "time") var ch chan int = make(chan int, 1) func main() {    go aaa() select {    case <-ch: //拿到锁        fmt.Println("c

golang chan 发送接收测试数据

测试代码: package main import (     "fmt"     "time" ) const (     num = 10000000  // 测试1千万次发送和接收 ) func main() {     TestChan2() } func TestChan2() {     st := time.Now().UnixNano()     c := make(chan int)     go func() {         var n in

Java程序员的Golang入门指南(上)

Java程序员的Golang入门指南 1.序言 Golang作为一门出身名门望族的编程语言新星,像豆瓣的Redis平台Codis.类Evernote的云笔记leanote等. 1.1 为什么要学习 如果有人说X语言比Y语言好,两方的支持者经常会激烈地争吵.如果你是某种语言老手,你就是那门语言的"传道者",下意识地会保护它.无论承认与否,你都已被困在一个隧道里,你看到的完全是局限的.<肖申克的救赎>对此有很好的注脚: [Red] These walls are funny.

golang控制channel的出入口

golang控制channel的出入口 我们常常使用channel来在多个goroutine之间做数据通讯,但是chan作为函数的入参我们应该怎么写呢?也许有人觉得这个问题比较傻,不过这个还真的是我今天才知道的. 首先我们看看下面的代码: func main() { c := make(chan int) go in(c) go out(c) time.Sleep(time.Second) } func in(c chan int) { for i := 0; i < 10; i++ { c <

golang性能监控初探

最近在用golang写一个server.压力测试过程发现反应比较慢,但是由于中间的操作都是串行的,无法知道在哪个操作消耗了比较多时间. 一开始想到的是打log.但是单个请求又是很快的,于是想到如下方案 在调用每个函数的时候,统计该函数的时耗,然后利用channel把同一个函数调用发送到同一个地方,利用map进行累计统计(这里可以更近一步,比如统计每个worker甚至每个services的状态,包括最长请求时间,最短请求时间,平均消耗等等,如果加上runtime还可以记录其他的运行相关信息). 一

在Golang中实现有无限容量的同步Queue

chan对象是Golang的一个核心卖点,可以轻松实现goroutine之间的通信.Golang允许我们为chan设置不同的缓冲大小.当默认缓冲大小为0的时候,一个goroutine对chan的写入操作必须要等到有其他goroutine对chan进行读取的时候才会返回,反之一个goroutine对chan进行读取的时候要等到另外一个goroutine对chan进行写入才会返回.如果我们不希望每次对chan进行读取和写入都堵塞的话,可以对chan设置缓冲大小.这样,在缓冲区没满之前,gorouti

golang

go语言特性: ◆ 自动垃圾回收 具备系统自动释放资源 ◆更丰富的内置类型 map类型.slice类型(类似vector) ◆函数多返回值 跟lua/erlang一样,支持函数多返回值,优化输入输出参数.结构体参数等传递 ◆错误处理 defer/recover/panic, defer用于资源的释放,go语言不提供构造和析构, recover截取错误处理流程,一般在使用defer的关键字函数中使用:若在无异常的goroutine中使用recover,会导致此goroutine所在的进程打印错误信

Golang关键字【汇总】

Golang的25个关键字: break case chan const continue default defer else fallthrough for func go goto if import interface map package range return select struct switch type var

Golang基础学习总结

1.不支持继承 重载 ,比如C++Java的接口,接口的修改会影响整个实现改接口的类行为的修改,Go 设计者认为这一特点或许根本没用. 2.必任何函数定义必须花括号跟在函数声明后面而不能换行 如 func  funca(a int){},在Go语言中 函数也是一种类型 可以被推导  使用支持匿名函数 和闭包. 函数的返回值支持多重返回类似Python , 如果不赋值  整数类型默认 0     浮点数类型默认0.0   error类型 默认是nil 3.不用的包一定不要引入,这是Go的原则,就如