标签: channel

创建频道时的新vs制作

在Go中,我阅读文档并理解make和之间的基本差异new

  • new:返回一个指针(*T)和它指向的零值
  • make:返回类型T.

我阅读文档,主要是使用数组的示例.我在创建数组时理解newvs.make但是在创建频道时我不明白差异:

c1 := new(chan string)
c2 := make(chan string)
Run Code Online (Sandbox Code Playgroud)

除了c1具有类型(chan*)和c2具有类型chan之外,真正的差异是什么.

谢谢

channel go

-1
推荐指数
1
解决办法
59
查看次数

如何始终从golang频道获取最新价值?

我开始使用Go,我现在正在编写一个简单的程序,它从传感器中读取数据并将其放入一个通道中进行一些计算.我现在的工作如下:

package main

import (
    "fmt"
    "time"
    "strconv"
)

func get_sensor_data(c chan float64) {
    time.Sleep(1 * time.Second)  // wait a second before sensor data starts pooring in
    c <- 2.1  // Sensor data starts being generated
    c <- 2.2
    c <- 2.3
    c <- 2.4
    c <- 2.5
}

func main() {

    s := 1.1

    c := make(chan float64)
    go get_sensor_data(c)

    for {
        select {
        case s = <-c:
            fmt.Println("the next value of s from the channel: " + strconv.FormatFloat(s, …
Run Code Online (Sandbox Code Playgroud)

parallel-processing concurrency channel multiprocessing go

-1
推荐指数
2
解决办法
1052
查看次数

在 goroutine 中通过 sleep 等待主线程

编写这个非常基本的代码来理解通道。

  1. 如果一个 Goroutine 中有等待,为什么主 Goroutine 还要等待它呢?我读到主 Goroutine 需要有一个等待时间,因为在调用 Goroutine 后控制权会立即传回给它。

  2. 为什么goroutine不像java中的主线程和子线程那样设计可以并行运行?

func main() {
    channel := make(chan int)
    go func() {
        time.Sleep(3*time.Second)
    }()

    for {
        fmt.Println("../");
        <-channel
    }
}
Run Code Online (Sandbox Code Playgroud)

sleep channel go

-1
推荐指数
1
解决办法
1795
查看次数

无缓冲通道是否等待数据?

我有这个程序:

package main

import (
    "fmt"
    "time"
)

var ch1 = make(chan int)
var ch2 = make(chan int)

func f1() {
    select {
    case <-ch1:
        fmt.Println("ch1")
    }
}
func f2() {
    select {
    case <-ch2:
        fmt.Println("ch2")
    }
}
func main() {
    go f1()
    go f2()
    time.Sleep(2 * time.Second)
    fmt.Println("no buffered channel will wait?")
    ch1 <- 1
    ch2 <- 2
    fmt.Println("main exits")
}
Run Code Online (Sandbox Code Playgroud)

我想到的是,只要F1和F2不显示任何信息,这意味着CH1和CH2具有里面什么都没有,所以ch1<-1ch2<-2应该阻止?

但是当运行时,它会打印:

no buffered channel will wait?
main exits
Run Code Online (Sandbox Code Playgroud)

为什么那些无缓冲通道ch1,并ch2没有阻止内主? …

buffer locking channel go

-1
推荐指数
1
解决办法
85
查看次数

如何用时间编写我自己的睡眠功能.之后?

我正在尝试编写自己的睡眠功能,相当于在Go中time.Sleep使用time.After.

这是代码.第一次尝试:

func Sleep(x int) {
  msg := make(chan int)
  msg := <- time.After(time.Second * x)
}
Run Code Online (Sandbox Code Playgroud)

第二次尝试:

func Sleep(x int) {
 time.After(time.Second * x)
}
Run Code Online (Sandbox Code Playgroud)

两者都返回错误,有人可以向我解释如何编写等同于time.Sleep使用的睡眠功能time.After,如果可能的话,何时使用通道?

time sleep channel go

-2
推荐指数
1
解决办法
552
查看次数

在通道上迭代时出现错误“范围内的变量过多”

我在这里迷失了方向,我试图让一个goroutine添加到数组中,并从中读取另一个goroutine,我怀疑它与下面的内容有些相似,但我需要尝试使用wait() 。

但是,我遇到了错误prog.go:19:14: too many variables in range,第19行是for _, v := range c {我在网上找不到答案,我在做什么或不做什么?

package main

import (
    "fmt"
    //"time"
    "sync"
)

func hello(wg *sync.WaitGroup, s []int, c chan int) {
    for _, v := range s {
        c <- v
    }
    fmt.Println("Finished adding to channel")
    wg.Done()
}

func hello2(wg *sync.WaitGroup, c chan int) {
    fmt.Println("Channel",c)
    for _, v := range c {
        fmt.Println("Received",v)   
    }
    fmt.Println("Finished taking from channel")
    wg.Done()
}

func main() {
    s := …
Run Code Online (Sandbox Code Playgroud)

for-loop channel go

-2
推荐指数
1
解决办法
925
查看次数

Go中令人难以置信的并行任务的惯用解决方案是什么?

我目前正在盯着以下代码的增强版本:

func embarrassing(data []string) []string {
  resultChan := make(chan string)
  var waitGroup sync.WaitGroup
  for _, item := range data {
    waitGroup.Add(1)
    go func(item string) {
      defer waitGroup.Done()
      resultChan <- doWork(item)
    }(item)
  }

  go func() {
    waitGroup.Wait()
    close(resultChan)
  }()

  var results []string
  for result := range resultChan {
    results = append(results, result)
  }
  return results
}
Run Code Online (Sandbox Code Playgroud)

这只是在想我的想法.所有这一切都可以用其他语言表达为

results = parallelMap(data, doWork)
Run Code Online (Sandbox Code Playgroud)

即使在Go中不能轻易做到这一点,是不是还有比上面更好的方法呢?

concurrency channel go goroutine

-2
推荐指数
1
解决办法
357
查看次数

Goroutine中不包含关键字“ go”的比较

以下代码记录了一个错误:

致命错误:所有goroutine都在睡着-死锁!

package main

import "fmt"

func main() {
    ch := make(chan int)
    ch <- 1
    fmt.Println(<-ch)
}
Run Code Online (Sandbox Code Playgroud)

但是,当我将代码更改为:

package main

import "fmt"

func assign (ch chan int) {
    ch <- 1
}

func main() {
    ch := make(chan int)
    go assign (ch)

    fmt.Println(<-ch)
}
Run Code Online (Sandbox Code Playgroud)

打印出“ 1”。

然后我使用了缓冲通道:

package main

import "fmt"

func main() {
    ch := make(chan int, 2)
    ch <- 1
    ch <- 2
    fmt.Println(<-ch)
    fmt.Println(<-ch)
}
Run Code Online (Sandbox Code Playgroud)

也可以打印“ 1”和“ 2”。

我对此情况有些困惑。提前致谢!

channel go goroutine

-2
推荐指数
1
解决办法
67
查看次数

如何确定从渠道接收的顺序?

考虑以下来自go 之旅的示例。

如何确定频道的接收顺序?为什么 x 总是从 gorouting 获得第一个输出?这听起来很合理,但我没有找到任何关于它的文档。我尝试添加一些睡眠,但仍然从第一次执行的 gorouting 中获取输入。

    c := make(chan int)
    go sumSleep(s[:len(s)/2], c)
    go sum(s[len(s)/2:], c)
    x, y := <-c, <-c // receive from c

    fmt.Println(x, y, x+y)
Run Code Online (Sandbox Code Playgroud)

睡眠是发送到通道之前。

channel go goroutine

-2
推荐指数
1
解决办法
78
查看次数

如何从Go通道获取(并忽略)一个值

我在select声明中有以下代码.finish是类型的bool.实际上,只要我收到任何东西,我甚至都不关心它的价值.但是,Go给了我一个未使用的变量错误.我怎么能绕过它呢?

case finish := <- termSig:
Run Code Online (Sandbox Code Playgroud)

我目前的解决方法是Println(finish).

我试过了: -

case _ := <- termSig:
Run Code Online (Sandbox Code Playgroud)

但这也不起作用.

channel go

-3
推荐指数
1
解决办法
788
查看次数

如何在节点 js 服务器中创建通道 websocket

我想使用 node js 在 websocket 服务器中创建一个通道并向订阅者发送消息。我需要一个简单的代码来开始。感谢您的帮助。

channel websocket node.js

-3
推荐指数
1
解决办法
4191
查看次数

当非默认输入通道时,为什么选择进入时总是选择默认情况?

我是新来编程的人。这是我的代码。我试图将值分配给一个结构并将该结构分配给通道。但这不是设置它,而是要使用默认情况。

package main
import (
    "fmt"
)
type object struct {
    a int
    b string
}
func main() {

    o1 := object{
        a: 25,
        b: "quack",
    }

    var oc chan object
    select {
    case oc <- o1:
        fmt.Println("Chan is set")
    default:
        fmt.Println("Chan is not set")
    }
}
Run Code Online (Sandbox Code Playgroud)

select channel go

-3
推荐指数
1
解决办法
45
查看次数

上下文 - WithDeadline() 与 WithTimeout()

下面的代码:

// Sample program to show how to use the WithDeadline function
// of the Context package.
package main

import (
    "context"
    "fmt"
    "time"
)

type data struct {
    UserID string
}

func main() {

    // Set a duration.
    // duration := 150 * time.Millisecond
    duration := time.Now().Add(3 * time.Second)

    // Create a context that is both manually cancellable and will signal
    // a cancel at the specified duration.
    ctx, cancel := context.WithDeadline(context.Background(), duration)
    defer cancel()

    // Create a channel …
Run Code Online (Sandbox Code Playgroud)

channel go goroutine

-4
推荐指数
2
解决办法
1356
查看次数