鍍金池/ 問答/Java  GO  網(wǎng)絡安全/ go語言實現(xiàn) in_array的問題

go語言實現(xiàn) in_array的問題

問題描述

GO語言實現(xiàn)in_array的問題,即判斷一個值是否在slice中存在

問題出現(xiàn)的環(huán)境背景及自己嘗試過哪些方法

相關代碼

// 請把代碼文本粘貼到下方(請勿用圖片代替代碼)

func main()  {
    str1 := "dd"
    strArr := []string{"aa","bb","cc","dd"}   
    exists := inArray(str1, strArr)
    fmt.Println(exists)
}


func inArray(need interface{}, needArr []interface{}) bool {
     for _,v := range needArr{
        if need == v{
            return true
        }
    }
    return false
}

你期待的結果是什么?實際看到的錯誤信息又是什么?

期待結果是  need是可傳入的任何類型的值, needArr 傳入一個任何類型的slice,檢查結果返回true或false,

實現(xiàn)錯誤是:
# command-line-arguments

srctestinarray.go:14:19: cannot use strArr (type []string) as type []interface {} in argument to inArray

回答
編輯回答
扯不斷

Go 不支持泛型的,[]xx 和 []interface{} 是兩種類型。

要么寫個腳本生成一堆類型的的 in_array,要么犧牲效率用 reflect??磮鼍?。

等 Go2 吧

2018年9月3日 18:53
編輯回答
風清揚

可以參考這個, 文中也有一些解釋, 來自官方 wiki

var dataSlice []int = foo()
var interfaceSlice []interface{} = make([]interface{}, len(dataSlice))
for i, d := range dataSlice {
    interfaceSlice[i] = d
}

代碼來源

2017年11月15日 23:48
編輯回答
毀了心

我給你一個我寫的參考的包garray,里面有排序和非排序的slice,不同類型的slice檢索的方式也不一樣:
https://gitee.com/johng/gf/tr...

2017年10月12日 09:58
編輯回答
孤影

這么簡單的問題,大家竟然這么積極,果然Golang環(huán)境是越來越好了

2017年12月18日 07:25
編輯回答
愚念

這是對基礎語法有誤解了。
inArray 函數(shù)參數(shù)類型為 []interface{} 表示元素類型為 interface{} 的切片,是說里面每個元素都可以是不同的類型,比如 a := []interface{}{"test", 123, map[int]string{2:"bb"}} 里面的三個元素類型均不一致。
而如果傳入的是指定類型像你的寫 []string{}, 那么就是說切片里每一個元素都必須是 string 類型,這顯然與 inArray 的形參 []interface{} 要表達的意思不符。
所以,實參類型還得是 []interface{} ,里面元素可以是任意類型的。

2018年2月10日 11:54
編輯回答
薔薇花
func maim() {
    var (
        str1   interface{}
        strArr []interface{}
    )
    str1 = "dd"
    strArr = []interface{}{"aa", "bb", "cc", "dd"}
    exists := inArray(str1, strArr)
    fmt.Println(exists)
}

func inArray(need interface{}, needArr []interface{}) bool {
    for _, v := range needArr {
        if need == v {
            return true
        }
    }
    return false
}
2018年8月15日 04:32
編輯回答
冷咖啡
func main()  {
    str1 := "dd"
    strArr := []string{"aa","bb","cc","dd"}
    exists := inArray(len(strArr), func(i int) bool {return strArr[i] == str1})
    fmt.Println(exists)
}

func inArray(n int, f func(int) bool) bool {

    for i := 0; i < n; i++ {
       if f(i) {
          return true
       }
    }
    return false
}

查找這個事,只有比較函數(shù)和類型有關,算法邏輯本身和類型無關,所以把比較函數(shù)作為一個參數(shù),就可以達到通用算法的效果了。

2018年5月16日 15:21