Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >go:如何将定向通道传递给接受双向信道的函数?

go:如何将定向通道传递给接受双向信道的函数?
EN

Stack Overflow用户
提问于 2015-02-16 04:41:25
回答 2查看 1.3K关注 0票数 3

Hi有一个接受chan []byte的函数(因为没有指定方向,我理解它是双向的)。该函数不发送或接收任何内容,只查看通道中与统计相关的元素数量。

我想在一个具有以下签名的函数中调用此函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func foo(fooChannel chan<- []byte)

但是,当我试图使用参数调用另一个函数时,我得到了错误cannot use fooChannel (type <-chan []byte) as type chan []byte in function argument

有没有办法将fooChannel转换为chan []byte

由于我只对获得一些统计数据感兴趣,我应该如何原型这个函数来接受任何类型的通道(这样我甚至可以去掉“字节”部分)?我只使用作为参数接收到的通道的lencap

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-16 05:08:27

略作改动:

“有没有一种方法可以将一个定向通道投射到一个没有定向的通道?”不没有。

“Go中是否有‘任意通道’的概念(没有元素类型)?”不,没有。没有仿制药。

您必须编写几个函数。

票数 1
EN

Stack Overflow用户

发布于 2015-02-16 11:25:08

有没有将fooChannel转换为chan []字节的方法?

不,对不起。这可能是为了防止有人认为他们想发送到接收频道无论如何。但是,只是一个小小的东西,但是..。不是的。

该函数不发送或接收任何内容,只查看通道中与统计相关的元素数量。..。我只使用作为参数接收到的通道的lencap

如果它不以任何信道的方式使用通道,您可以直接将len(ch)cap(ch)作为参数传递。如果您出于任何原因不喜欢它,可以使用reflect包,这将允许您在支持它的任何类型(数组、通道、切片)上调用lencap

这可能是一个好的开端:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "fmt"
    "reflect"
)

func stats(i interface{}) {
    v := reflect.ValueOf(i)
    fmt.Printf("%s size: %d/%d\n", v.Kind(), v.Len(), v.Cap())
}

func main() {
    ch := make(chan int, 10)
    ch <- 1
    stats(ch)
}

// Output: chan size: 1/10

http://play.golang.org/p/2ehYvEmDkS

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28541658

复制
相关文章
Vue 中,如何将函数作为 props 传递给组件
作者:Michael Thiessen 译者:前端小智 来源:medium 点赞再看,养成习惯本文 GitHub https://github.com/qq44924588... 上已经收录,更多往
前端小智@大迁世界
2020/05/18
8.2K0
Go 函数可变参数传参
众所周知,Go语言是严格类型语言,而开发的时候又遇到传入参数不定的情况,怎么办?golang 为我们提供了接入多值参数用于解决这个问题。
IT工作者
2022/06/30
1.6K0
chan 信道
信道是实现 Go 协程间的通信的桥梁,信道可以想像成 Go 协程之间通信的管道。如同管道中的水会从一端流到另一端,通过使用信道,数据也可以从一端发送,在另一端接收。
酷走天涯
2019/06/11
5710
chan 信道
如何将多个参数传递给 React 中的 onChange?
在 React 中,一些 HTML 元素,比如 input 和 textarea,具有 onChange 事件。onChange 事件是一个非常有用、非常常见的事件,用于捕获输入框中的文本变化。有时候,我们需要将多个参数同时传递给 onChange 事件处理函数,在本文中,我们将介绍如何实现这一目标。
网络技术联盟站
2023/06/07
2.7K0
go语言中函数参数传值还是传引用的思考
算起来这些年大大小小也用过一些不同编程语言,但平时开发还是以C++为主,得益于C++精确的语义控制,我可以在编写代码的时候精准地控制每一行代码的行为,以达到预期的目的。但是C++的这种强大的语义控制,就带来了极多的概念和极大的学习成本,几乎逼着使用者不得不去了解该语言中的所有细节行为,以防出现意料之外的情况。新时代的语言如golang等,较之C++就好比美图秀秀对比photoshop(绝非贬义),同样都提供了修图的功能,但是前者屏蔽了诸多细节,更傻瓜式且易于使用,一样能达到好的效果;而后者则提供了更多专业的编辑手段,能够满足更精细化更底层的需求,但是随之而来的就是巨大的学习成本。显然两者各有优劣,但是对当今快速发展的互联网来说,以golang为代表的新时代语言更加能够适应敏捷开发的模式,比较起来,C++这些前辈还是“太重”了。
tyriqchen
2019/04/22
4.7K0
信道:如何通过信道完成Go程(goroutine)同步?
中文译为信道,英文是Channel,发音为[ˈtʃænl]),在Go语言中简写为chan。
LIYI
2021/01/21
1.1K0
go的单向通道
我们可以通过channel做为协程通信,但是为了避免多协程中操作通道时污染变量,我们可以通过单向通道进行限制
仙士可
2022/01/25
6580
React篇(029)-如何将参数传递给事件处理程序或回调函数?
你可以使用箭头函数来包装事件处理器并传递参数: <button onClick={() => this.handleClick(id)} /> 这相当于调用 .bind: <button onClick={this.handleClick.bind(this, id)} />
齐丶先丶森
2022/05/12
3.7K0
go语言函数传值与指针的相关问题
最近在快速阅读《go语言高级编程》,里面提到Go语言的栈会自动调整大小,所以go程序员是难以关心栈的运行机制。比如说,程序员很难知道局部变量到底是保存在栈中还是保存在堆中
千灵域
2022/06/17
7570
如何快速理解go的并发?【Golang 入门系列十五】
Go是并发语言,而不是并行语言。所以我们在讨论,我们首先必须了解什么是并发,以及它与并行性有什么不同。
架构师精进
2019/11/28
6670
Go - chan 通道
在 go 关键字后面加一个函数,就可以创建一个线程,函数可以为已经写好的函数,也可以是匿名函数。
新亮
2019/08/06
6520
linux双向重定向之tee命令
原文链接:https://rumenz.com/rumenbiji/linux-tee.html
入门笔记
2021/11/27
1.6K0
linux双向重定向之tee命令
tee的作用是将一份标准输入多重定向,一份重定向到标准输出/dev/stdout,然后还将标准输入重定向到每个文件FILE中。 在执行Linux命令时,我们可以把输出重定向到文件中,比如 ls >rumenz.txt,这时不能看到输出了,如果我们既想把输出保存到文件中,又想在屏幕上看到输出内容,就可以使用tee命令了. tee流程示意图 img 命令语法 > tee [options] FILE1 FILE2 FILE3... 保存当前目录文件列表到文件并打印到屏幕 > ls -al | tee ru
入门笔记
2022/06/02
8270
linux双向重定向之tee命令
go语言接受者的选取
1.如果接受者是一个 map,func 或者 chan,使用值类型(因为它们本身就是引用类型)。 2.如果接受者是一个 slice,并且方法不执行 reslice 操作,也不重新分配内存,使用值类型。 3.如果接受者是一个小的数组或者原生的值类型结构体类型(比如 time.Time 类型),而且没有可修改的字段和指针,又或者接受者是一个简单地基本类型像是 int 和 string,使用值类型就好了。
charlieroro
2020/03/24
4250
1.Go-copy函数、sort排序、双向链表、list操作和双向循环链表
双向链表结构中元素在内存中不是紧邻空间,而是每个元素中存放上一个元素和后一个元素的地址
zhang_derek
2019/08/06
8140
1.Go-copy函数、sort排序、双向链表、list操作和双向循环链表
Go并发编程
百度Go语言优势,肯定有一条是说Go天生就有支持并发的优势,其他语言支持多线程并发,需要一定的门槛,基础的积累,学习多线程、进程语法。在Go中,就不需要考虑这些,原生提供goroutine(协程),自动帮你处理任务,
用户9022575
2021/10/01
5620
如何证明Go函数 传参都是值传递
相信很多初学Go开发的同学,或者在面试过程中都会遇到这样一个问题。Go中的函数传参是值传递还是引用传递。在这个问题上有的同学会有一个错误的意识。
兔云小新LM
2022/11/21
5670
如何证明Go函数 传参都是值传递
Go语言——双向链表
[ nil | cur | next ]—><—[ prev | cur | next ]—><—[ prev | cur | nil ]
传说之下的花儿
2023/04/16
3130
go channel 通信通道
go中最重要的一种通信通道就是channel 1.给一个 nil channel 发送数据,造成永远阻塞 2.从一个 nil channel 接收数据,造成永远阻塞 3.给一个已经关闭的 channel 发送数据,引起 panic 4.从一个已经关闭的 channel 接收数据,立即返回一个零值 package main import "fmt" // 此channel没有设置缓存,将被阻塞,所以都是执行default func main() { messages := make(chan
李海彬
2018/03/19
8400
Go基础——channel通道
要想理解 channel 要先知道 CSP 模型。CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,由 Tony Hoare 于 1977 年提出。简单来说,CSP 模型由并发执行的实体(线程或者进程)所组成,实体之间通过发送消息进行通信,这里发送消息时使用的就是通道,或者叫 channel。CSP 模型的关键是关注 channel,而不关注发送消息的实体。Go 语言实现了 CSP 部分理论,goroutine 对应 CSP 中并发执行的实体,channel 也就对应着 CSP 中的 channel。
羊羽shine
2019/05/28
7280

相似问题

go函数通道死锁

20

通道关闭:信道错误

12

如何将任何Go变量传递给一个接受void *的C函数?

134

Go中的信道死锁

33

并发发送/接收go信道

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文