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
Mysql 我应该为任何异步操作调用单独的goroutine吗?_Mysql_Go_Asynchronous_Goroutine_Go Gorm - Fatal编程技术网

Mysql 我应该为任何异步操作调用单独的goroutine吗?

Mysql 我应该为任何异步操作调用单独的goroutine吗?,mysql,go,asynchronous,goroutine,go-gorm,Mysql,Go,Asynchronous,Goroutine,Go Gorm,我刚开始学习Go,背景是NodeJS。我编写了以下程序,打开与数据库的连接,查询数据库表并打印记录 package main import ( "fmt" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" "github.com/jinzhu/gorm" "io" "net/http" ) type User struct { gorm.Model Use

我刚开始学习Go,背景是NodeJS。我编写了以下程序,打开与数据库的连接,查询数据库表并打印记录

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jinzhu/gorm"
    "io"
    "net/http"
)

type User struct {
    gorm.Model
    Username string
    Password string
}



func main() {
    db, err := gorm.Open("mysql","root:1234@(localhost)/database_test")
    db.LogMode(true)
    defer db.Close()
    if err != nil {
        panic("failed to connect to the database")
    }

    var users []User
    db.Table("user").Find(&users)
    fmt.Println("after finding the user")
    fmt.Println("user ", users)
}
代码运行良好。但是我想了解这一点,这个程序不是阻止了主线程吗?我应该在单独的goroutine中执行任何异步操作,比如在
main
内部进行的数据库调用吗

我一直在使用NodeJS的
Promises
,所以使用Go时感觉有点不同

编辑:在主方法中添加goroutine后

下面的代码调用一个单独的goroutine来查询数据库。但是它是否仍然阻塞了主线程,因为它正在等待来自通道的响应?如果是,是否有更好的方法

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jinzhu/gorm"
    "io"
    "net/http"
)

type User struct {
    gorm.Model
    Username string
    Password string
}

func dbRead(db *gorm.DB) <-chan []User {
    c := make(chan []User)
    go func() {
        fmt.Println("starting the go routine to find the users")
        defer close(c)
        var users []User
        db.Table("user").Find(&users)
        c <- users
    }()

    return c
}

func main() {
    db, err := gorm.Open("mysql","root:1234@(localhost)/database_test")
    db.LogMode(true)
    defer db.Close()
    if err != nil {
        panic("failed to connect to the database")
    }

    userList := <-dbRead(db)
    fmt.Println("user ", userList)
}
主程序包
进口(
“fmt”
“github.com/gin gonic/gin”
_“github.com/go-sql-driver/mysql”
“github.com/jinju/gorm”
“io”
“net/http”
)
类型用户结构{
戈姆模型
用户名字符串
密码字符串
}

func dbRead(db*gorm.db)这在很大程度上取决于您希望在程序中实现什么。在这种情况下,main确实会阻塞,但取决于您在main中还想做什么,您可能想去goroutines,也可能不想去goroutines。如果使用goroutines,很可能会使用通道在方法之间进行数据交换。@favoretti通过添加go例程并接收通道的响应来更新我的问题。但问题仍然是一样的?看起来在我收到来自频道主线程的响应之前,它会一直被阻塞?我想这只是目前的学术问题。要解除对main的阻止,您需要在另一个goroutine中使用来自您通道的消息:)也就是说,main应该等待goroutine完成工作,如果您在启动不受控制的goroutine时退出main,main将直接退出而不等待它们完成。检查一下,你就会知道什么时候使用goroutines。在那之前,保持简单。模拟nodejs所做的一切完全没有意义。围棋是一种非常不同的语言。它很大程度上取决于你想在你的程序中实现什么。在这种情况下,main确实会阻塞,但取决于您在main中还想做什么,您可能想去goroutines,也可能不想去goroutines。如果使用goroutines,很可能会使用通道在方法之间进行数据交换。@favoretti通过添加go例程并接收通道的响应来更新我的问题。但问题仍然是一样的?看起来在我收到来自频道主线程的响应之前,它会一直被阻塞?我想这只是目前的学术问题。要解除对main的阻止,您需要在另一个goroutine中使用来自您通道的消息:)也就是说,main应该等待goroutine完成工作,如果您在启动不受控制的goroutine时退出main,main将直接退出而不等待它们完成。检查一下,你就会知道什么时候使用goroutines。在那之前,保持简单。模拟nodejs所做的一切完全没有意义。围棋是一种非常不同的语言。