golang使用sqlx報錯:unsupported type []interface {}, a slice of interface

HNU_GeorgeYang發表於2020-12-29

問題:

自己使用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...)	/*這裡是正確寫法*/		

相關文章