作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个功能:
func f(input interface{}) interface{} {
t := reflect.ChanOf(reflect.BothDir, <type that depends on input>)
c := reflect.MakeChan(t, ...)
// ... push things from input into c ...
return c
}
它创建一个通道,其元素类型取决于输入。它可以这样使用,但我希望它适用于任何类型,而不仅仅是int:
x := f(1).(<-chan int)
失败是因为我必须在函数内部使用reflect.BothDir(因为我正在
f
内部向其发送值),因此实际类型为
chan <something>
。我只希望此功能的用户看到频道的接收端。从
chan <something>
返回之前,有什么方法可以将
<-chan <something>
“投射”到
f
吗?使用
<-chan interface{}
的返回类型不是一种选择,因为从该类型转到
<-chan <something>
将需要
f
的用户创建另一个通道并将值手动推入该通道,但我希望
f
用作单线。
func gen(input interface{}) interface{} {
xs := reflect.ValueOf(input)
chanType := reflect.ChanOf(reflect.BothDir, xs.Type().Elem())
out := reflect.MakeChan(chanType, 0)
go func() {
for i := 0; i < xs.Len(); i++ {
x := xs.Index(i)
out.Send(i)
}
out.Close()
}
return out.Interface()
}
现在,如果我想测试一个函数
g(<-chan int)
,我以前必须在其中编写
values := <input generated by quick.check>
in := make(chan int)
go func() {
for _, value := range values {
in <- value
}
close(in)
}()
g(in)
我现在确实可以简单地打电话
g(gen(values).(chan int))
而且效果很好。这是因为
gen
的返回类型是
chan int
,它将隐式转换为
<-chan int
。我的问题是关于这样的情况:
o := gen([]int{1, 1, 2, 3}).(chan int)
o <- 5 // You're not supposed to do that, sending to o is exclusive to the inside of the gen function
g(o)
我承认这种情况非常小众,即使Go无法提供防止这种情况的方法,我也会没事的,但是我主要是想知道如果我错过了某种语言的一部分,可以让我防止上述情况。
最佳答案
没有反射,您将使用(可能是隐式的)类型转换:
func sliceToChan(xs []int) <-chan int {
c := make(chan int)
// ...
return (<-chan int)(c) // or just `return c` for the implicit conversion
}
通过反射做同样的事情,即使用
Convert:
package main
import (
"fmt"
"reflect"
)
func main() {
x := sliceToChan([]int{1}).(<-chan int)
fmt.Println(cap(x))
}
func sliceToChan(input interface{}) interface{} {
xs := reflect.ValueOf(input)
elemType := xs.Type().Elem()
t := reflect.ChanOf(reflect.BothDir, elemType)
c := reflect.MakeChan(t, xs.Len())
for i := 0; i < xs.Len(); i++ {
x := xs.Index(i)
c.Send(x)
}
c.Close()
recvOnly := c.Convert(reflect.ChanOf(reflect.RecvDir, elemType))
return recvOnly.Interface()
}
在操场上尝试:
https://play.golang.org/p/RDaAA_l9ghN
关于go - 手动将chan转换/衰减到<-chan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63285586/
liwen01 2024.08.18 前言 无论是在产品开发还是在日常生活中,在使用无线网络的时候,都会经常遇到一些信号不好的问题,也会产生不少疑问: 为什么我们在高速移动的高铁上网络会变
我正在使用 Kinect 获取每个关节的位置和方向,然后将它们发送到 Unity。我注意到值有很多“跳跃”或波动,例如,有时我不移动我的手,而在 Unity 中它会旋转 180 度。 我想要的是一个平
在下面的示例中, #include #include //okay: // template decltype(auto) runner(T&& t, F f) { return f(st
出于某种原因,即使我设置了衰减因子,我的学习率似乎也没有改变。我添加了一个回调来查看学习率,它似乎在每个纪元之后都是一样的。为什么没有变化 class LearningRatePrinter(Call
考虑下面的代码: #include #include using namespace std; template void Test2(future f, Work w) { async([
我是一名优秀的程序员,十分优秀!