我使用的包裝件,gosqlite,具有帶有可變參數參數,其中它的類型是空接口的方法。通行證串切片可變參數空接口參數
func (s *Stmt) Exec(args ...interface{}) os.Error
我可以把這個很好,如果明確地傳遞各個參數:
statement := blah()
error := statement.Exec("hello", 3.0, true) // works fine
然而,作爲一個可變參數對應於佔位符in
操作我的SQL語句的select
內,這些佔位符的數量在編譯時不知道,但在運行時動態更改取決於用戶正在做什麼。例如。我結束了與SQL類似於以下,如果用戶輸入四個值:
SELECT * FROM sky WHERE name IN (?,?,?,?)
所以很自然,我想打電話給Exec
法串片:
var values []string = getValuesFromUser()
statement := createStatementWithSufficientNumberOfPlaceholders(len(values))
_ := statement.Exec(values...) // compiler doesn't like this
這並不編譯。我可以通過創建一個空的接口切片並通過複製引用解決這個問題:
values2 := make([]interface{}, len(values))
for index, value := range values { values2[index] = value }
_ := statement.Exec(values2...) // compiler happy but I'm not
這工作正常,但感覺有點笨重。我想知道是否有一些技巧能夠將values
直接傳遞給此函數,或者,如果沒有,那麼將字符串切片轉換爲空白接口的方法會更好嗎?
非常感謝。
我現在已經將轉換代碼內聯:當我添加它時,功能看起來過度。我猜這個問題最終是Go不支持我習慣於在Java和C#中使用協變數組/切片,這可能[並非壞事](http://en.wikipedia.org/wiki /Covariance_and_contravariance_(computer_science)#Arrays_in_C.23_and_Java)。 –