3 回答

TA貢獻1963條經(jīng)驗 獲得超6個贊
在這段代碼中(順便說一句,您不需要周圍的括號dest),一旦輸入案例,您基本上會忘記類型:
func foo(dest interface{}) {
switch dest.(type) {
case *int:
fmt.Println("got int")
*dest = 1
// handle other cases...
}
}
也就是說,根據(jù)編譯器, dest 仍然是 interface{} 類型,這是*dest = 1錯誤的。
你可以使用更多這樣的類型斷言......
func foo(dest interface{}) {
switch dest.(type) {
case *int:
fmt.Println("got int")
*dest.(*int) = 1
// handle other cases...
}
}
...但實際上“記住”類型的開關會好得多(來自Effective Go)
func foo(dest interface{}) {
switch dest := dest.(type) {
case *int:
fmt.Println("got int")
*dest = 1
// handle other cases...
}
}

TA貢獻1790條經(jīng)驗 獲得超9個贊
這個問題似乎有點老了,但我提出了一種使用反射來處理這個問題的更通用的方法,它不如其他解決方案快,但它適用于您傳遞給函數(shù)的任何其他類型
func foo(dest interface{}) {
destVal := reflect.ValueOf(dest)
val := reflect.ValueOf(1)
if destVal.Kind() == reflect.Ptr && destVal.Elem().Kind() == val.Kind() {
if destElem := destVal.Elem(); destElem.CanSet() {
destElem.Set(val)
}
}
}
- 3 回答
- 0 關注
- 183 瀏覽
添加回答
舉報