Я только что начал с 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)
}
Код работает нормально. Но я хочу понять это, не блокирует ли эта программа основной поток? Должен ли я выполнять какую-либо асинхронную операцию c, например, вызов базы данных, сделанный внутри main
в отдельной программе?
Я использую Promises
с NodeJS, поэтому с Go.
РЕДАКТИРОВАТЬ: После добавления горутина в основной метод * это немного отличается 1012 *
Следующий код вызывает отдельную процедуру для запроса базы данных. Но не блокирует ли он основной поток тем, что ожидает ответа от канала? Если да, лучше ли это сделать?
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)
}