golang使用sqlx報錯:unsupported type []interface {}, a slice of interface
問題:
自己使用sqlx運算元據庫,想封裝一個Insert函式:
func Insert(sql string,args ...interface{}) (int,bool){
ret, err := DataSource.Exec(sql, args) /*這裡是錯誤寫法*/
if err!=nil{
return 0,false
}
id, err := ret.LastInsertId()
return int(id),true
}
執行Insert時傳入sql和兩個引數,sqlx報錯:
id, b := datasource.Insert(datasource.INSERT_new_user, phone, nickname)
sql: converting argument $1 type: unsupported type []interface {}, a slice of interface
字面意思是sqlx在解析兩個佔位符並試圖填入引數時,第一個引數型別是空指標的切片,而預期是args這個可變引數中的第一個。
於是瞭解了一下golang中的可變引數,即…運算子
當...Type
作為引數時,本質上函式會把引數轉化成一個Type型別的切片,於是在上述程式碼中,Service層調以可變引數形式傳入兩個引數,在Insert中的args就已經是[]interface{}
型別了,如果直接把args作為func (db *DB) Exec(query string, args ...interface{}) (Result, error)
的引數,對於Exec來說,收到的args就只有一個長度為1的切片,其元素型別為[]interface{}
,於是就有了上述的報錯,解決辦法很簡單,就是在一個slice後加上...
,這樣就能把它拆包成一個可變引數的形式傳入函式。
文章開始的程式碼進行如下修改:
ret, err := DataSource.Exec(sql, args) /*這裡是錯誤寫法*/
↓
ret, err := DataSource.Exec(sql, args...) /*這裡是正確寫法*/
相關文章
- Golang之interfaceGolang
- cannot convert (type interface {}) to type int: need type assertion
- 【區分】Typescript 中 interface 和 typeTypeScript
- 使用Golang的interface介面設計原則Golang
- ts中的type 和 interface 區別
- TypeScript中,type、interface、class的區別TypeScript
- TypeScript 裡 interface 和 type 的區別TypeScript
- TypeScript中,interface和type使用上有什麼區別?TypeScript
- 深入理解Golang之interface和reflectGolang
- Golang 學習——interface 介面學習(一)Golang
- Golang 學習——interface 介面學習(二)Golang
- Golang | Go語言多型的實現與interface使用Golang多型
- 4. 黑科技 Interface |《 刻意學習 Golang 》Golang
- Golang語言中的interface是什麼(下)Golang
- Golang語言中的interface是什麼(上)Golang
- The ArrayAccess interface
- interface/介面
- Golang中的interface程式碼和允許效果Golang
- Golang高效實踐之interface、reflection、json實踐GolangJSON
- golang,interface轉換型別 cannot convert t (typGolang型別
- Interface中加Static
- Typescript 中的 interface 和 type 到底有什麼區別TypeScript
- Golang引入泛型:Go將Interface{}替換為“Any”Golang泛型
- 【Golang】Go 通過結構(struct) 實現介面(interface)GolangStruct
- public interface View介面和public interface ViewResolver介面介紹View
- Golang | 既是介面又是型別,interface是什麼神仙用法?Golang型別
- CHECK_INTERFACE作用
- 如何理解 interface 介面
- Java-介面(interface)Java
- firewalld: 介面interface操作
- 從goim定製, 淺談 golang 的 interface 解耦合與gRPCGolang解耦RPC
- 聊聊 Interface 在 Laravel 開發中的使用Laravel
- unsupported operand type(s) for +: ‘range‘ and ‘list‘
- Go interface實現分析Go
- go interface 的筆記Go筆記
- kubernetes container device interface (CDI)AIdev
- trait in rust, and comparison with interface in javaAIRustJava
- Shooter Game User Interface StarterGAM