将切片的所有项添加到通道中。

huangapple go评论100阅读模式
英文:

Add all the items of a slice into a channel

问题

在Go语言中,是否有一种更符合惯用方式的方法将数组/切片的所有元素添加到通道中,而不是像下面这样做?

  1. ch := make(chan string)
  2. values := []string{"lol", "cat", "lolcat"}
  3. go func() {
  4. for _, v := range values {
  5. ch <- v
  6. }
  7. }()

我希望能够像 ch <- values... 这样做,但是编译器会拒绝这种写法。

英文:

In Go, is there a more idiomatic way to add all of the elements of an array/slice into a channel than the following?

  1. ch := make(chan string)
  2. values := []string{&quot;lol&quot;, &quot;cat&quot;, &quot;lolcat&quot;}
  3. go func() {
  4. for _, v := range values {
  5. ch &lt;- v
  6. }
  7. }()

I was looking for something like ch &lt;- values... but that is rejected by the compiler.

答案1

得分: 1

一个for/range循环是将切片的所有元素发送到通道的惯用方法:

  1. for _, v := range values {
  2. ch <- v
  3. }

不必像问题中所示在goroutine中运行for循环。

英文:

A for/range loop is the idiomatic way to send all of the elements of a slice to a channel:

  1. for _, v := range values {
  2. ch &lt;- v
  3. }

It is not necessary to run the for loop in a goroutine, as shown in the question.

答案2

得分: 1

直到迭代器出现之前,是的,你写的代码是最符合惯用写法的。我将其封装为可在我工作的代码库中重用的形式,类似于以下代码:

  1. // ToChan 返回一个包含切片 s 中所有元素的通道。
  2. // 当所有元素都从通道中消费完毕时,通道将被关闭。
  3. func ToChan[T any](s []T) <-chan T {
  4. ch := make(chan T, len(s))
  5. for _, e := range s {
  6. ch <- e
  7. }
  8. close(ch)
  9. return ch
  10. }

https://go.dev/play/p/c5v4df_M1IG

英文:

Until iterators will come along, yes, the code you wrote is as idiomatic as it gets. I have it packaged for reuse as something like this in codebases I work on:

  1. // ToChan returns a channel containing all elements in the slice s.
  2. // The channel is closed when all elements are consumed from the channel.
  3. func ToChan[T any](s []T) &lt;-chan T {
  4. ch := make(chan T, len(s))
  5. for _, e := range s {
  6. ch &lt;- e
  7. }
  8. close(ch)
  9. return ch
  10. }

https://go.dev/play/p/c5v4df_M1IG

答案3

得分: -1

你可以声明一个字符串数组的通道,除非你绝对想要保留一个字符串的通道:

  1. package main
  2. import "fmt"
  3. func main() {
  4. ch := make(chan []string)
  5. values := []string{"lol", "cat", "lolcat"}
  6. go func() {
  7. ch <- values
  8. }()
  9. fmt.Printf("Values: %+v\n", <-ch)
  10. }

这段代码创建了一个通道 ch,类型为字符串数组。然后,将字符串数组 values 发送到通道 ch 中,并通过 <-ch 接收通道中的值,并使用 fmt.Printf 打印出来。

英文:

You can declare a chan of string arrays, unless you absolutely want to keep a chan of strings :

  1. package main
  2. import &quot;fmt&quot;
  3. func main() {
  4. ch := make(chan []string)
  5. values := []string{&quot;lol&quot;, &quot;cat&quot;, &quot;lolcat&quot;}
  6. go func() {
  7. ch &lt;- values
  8. }()
  9. fmt.Printf(&quot;Values : %+v\n&quot;, &lt;-ch)
  10. }

huangapple
  • 本文由 发表于 2015年10月6日 20:40:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/32970224.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定