第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

類型接口的通道沒有在 Golang 中使用 MySql 接收值

類型接口的通道沒有在 Golang 中使用 MySql 接收值

Go
楊__羊羊 2022-03-03 15:09:14
我是golang的新手。我正在嘗試使用 golang 對 mysql db 進(jìn)行并發(fā)查詢。我知道頻道可以是接口類型。tableData (type map)當(dāng)我在函數(shù)中打印時,RunQuery我得到了結(jié)果。我正在發(fā)送tableData到ch類型接口的 ie 通道。在函數(shù)getdataList中我沒有得到任何價值ch。我不明白我做錯了什么。以下是我的代碼:package mainimport (    "database/sql"    "fmt"    "net/http"    _ "github.com/go-sql-driver/mysql"    "log")var db *sql.DBfunc getdataList(id int) {        ch := make(chan interface{})        done := make (chan bool)        RunQuery(ch,"select id,name, last_name,first_name from persons where id= ?", id)        go func() {            for {            x, ok := <-ch //I am not getting any data in channel here            if ok {                fmt.Println(x)            }else {                fmt.Println("done")                done <- true                return            }        }        }()    }func RunQuery (ch chan interface{}, query string, param interface{}) {    stmt, err := db.Prepare(query)    if err != nil {                panic(err.Error())            }    defer stmt.Close()    rows, err := stmt.Query(param)    columns, err := rows.Columns()    if err != nil {        fmt.Println("Failed to get columns", err)        return    }    count := len(columns)    tableData := make([]map[string]interface{}, 0)    values := make([]interface{}, count)    valuePtrs := make([]interface{}, count)    for rows.Next() {      for i := 0; i < count; i++ {          valuePtrs[i] = &values[i]      }      rows.Scan(valuePtrs...)      entry := make(map[string]interface{})      for i, col := range columns {          var v interface{}          val := values[i]          b, ok := val.([]byte)          if ok {              v = string(b)          } else {              v = val          }          entry[col] = v      }      tableData = append(tableData, entry)  }    fmt.Pritln(tableData) //here I am getting data in map    ch <- tableData}func dbtest(w http.ResponseWriter, req *http.Request) {    go getdataList(2)    go getdataList(3)}
查看完整描述

1 回答

?
白板的微信

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個贊

您的代碼的問題在于它在從通道讀取數(shù)據(jù)之前阻塞了執(zhí)行流程。當(dāng)您調(diào)用RunQueryfromgetdataList時,RunQuery嘗試通過 channel 發(fā)送數(shù)據(jù)ch。但是,沒有讀取任何內(nèi)容,ch因?yàn)橐獜闹凶x取的代碼位于其中,getdataList并且位于對RunQuery.


因此,RunQuery永遠(yuǎn)不會返回并且要從中讀取的 goroutinech永遠(yuǎn)不會觸發(fā)。要修復(fù),您也可以嘗試RunQuery作為 goroutine 運(yùn)行:


func getdataList(id int) {

        ch := make(chan interface{})

        done := make (chan bool)

        // run in a goroutine

        go RunQuery(ch,"select id,name, last_name,first_name from persons where id= ?", id)

        go func() {

            for {

            x, ok := <-ch //I am not getting any data in channel here

            if ok {

                fmt.Println(x)

            }else {

                fmt.Println("done")

                done <- true

                return

            }


        }

    }()

}

您的代碼中還有另一個問題。你永遠(yuǎn)不會關(guān)閉ch。這可能會導(dǎo)致死鎖。最理想的地方似乎是RunQuery:


func RunQuery (ch chan interface{}, query string, param interface{}) {

    // ...

    ch <- tableData

    close(ch)

}


查看完整回答
反對 回復(fù) 2022-03-03
  • 1 回答
  • 0 關(guān)注
  • 229 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號