Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 在获取用户输入之前,TCP连接已关闭_Go_Goroutine - Fatal编程技术网

Go 在获取用户输入之前,TCP连接已关闭

Go 在获取用户输入之前,TCP连接已关闭,go,goroutine,Go,Goroutine,我已设置服务器以等待TCP连接并从用户处读取输入: func main() { err := godotenv.Load() if err != nil { log.Fatal(err) } server, err := net.Listen("tcp", ":"+os.Getenv("PORT")) if err != nil { log.Fatal(err) } log.Println("HTTP Server Listening on po

我已设置服务器以等待TCP连接并从用户处读取输入:

func main() {
  err := godotenv.Load()
  if err != nil {
    log.Fatal(err)
  }

  server, err := net.Listen("tcp", ":"+os.Getenv("PORT"))

  if err != nil {
    log.Fatal(err)
  }

  log.Println("HTTP Server Listening on port :", os.Getenv("PORT"))
  defer server.Close()

  for {
    conn, err := server.Accept()
    if err != nil {
      log.Fatal(err)
    }
    go handleConn(conn)
  }
}
我遇到的问题是我的
handleConn
功能。我想开始将输入读取到goroutine中,因为会有额外的数据处理。但是,当我连接到我的服务器(
nclocalhost 9000
)时,我的连接会立即断开

func handleConn(conn net.Conn) {
  defer conn.Close()
  io.WriteString(conn, "Enter a transaction:")

  scanner := bufio.NewScanner(conn)

  go func() {
    for scanner.Scan() {
      log.Println("User entered: ")
      log.Println(scanner.Text())
    }

  }()
}
我看到消息
输入事务:
,但我无法输入任何内容,因为我的连接立即终止,我被踢回bash终端。我做错了什么

编辑:我正在学习本教程-


我已经尝试将
scanner.Scan()
移动到goroutine之外,这是可行的,但是这里的代码示例在goroutine内部,他的示例也有效。为什么会出现这种情况?

由于您正在
handleConn
函数中生成一个goroutine,它不需要等待任何返回,因此延迟的
conn.Close()
将运行并关闭连接。您可能需要在goroutine外运行
scanner.Scan()
,以阻止等待输入。

由于您正在
handleConn
函数中生成goroutine,它不需要等待任何返回,因此延迟的
conn.Close()
将运行并关闭连接。您可能需要在goroutine之外运行
scanner.Scan()
,以阻止等待输入。

我正在学习本教程-。他还将scanner.Scan()放在goroutine中,我测试了他的代码,结果它正常工作。你知道为什么会出现这种情况吗?可能是因为goroutine在收到用户输入后会阻止等待从该频道接收。太好了,谢谢你的解释!我没有意识到他们使用的变量实际上是一个通道。我遵循了本教程-。他还将scanner.Scan()放在goroutine中,我测试了他的代码,结果它正常工作。你知道为什么会出现这种情况吗?可能是因为goroutine在收到用户输入后会阻止等待从该频道接收。太好了,谢谢你的解释!没有意识到他们使用的变量实际上是一个通道。