咨询个问题,如何判断一个值是否在slice或者array里

package main

import (
    "fmt"
)

func main() {
    var slice []string
    slice = append(slice, "a")
    slice = append(slice, "b")
    //请问下面怎么判断"a"是否在slice里?类似于php的in_array?谢谢...
}

共 11 个回复


yinziyang

群里有个哥们给了我这么一段代码, 我看了下, target是array或者slice就需要做遍历, 这样会不会影响效率, 有没有更好的办法? 谢谢各位

func Contains(obj interface{}, target interface{}) (bool, error) {
    targetValue := reflect.ValueOf(target)
    switch reflect.TypeOf(target).Kind() {
    case reflect.Slice, reflect.Array:
        for i := 0; i < targetValue.Len(); i++ {
            if targetValue.Index(i).Interface() == obj {
                return true, nil
            }
        }
    case reflect.Map:
        if targetValue.MapIndex(reflect.ValueOf(obj)).IsValid() {
            return true, nil
        }
    }
    return false, errors.New("not in")
}
# 0

stevewang

那你为什么一定要用slice/array呢?用map不就好了。

# 1

ggaaooppeenngg

你要担心搜索慢,先排序再二分搜索...参见标准库sort.Search 再要快就只能并发搜索了...

# 2

yinziyang

我是想知道官方有没有提供类似php的in_array这种方法 看来还是得自己实现才行 谢谢各位~~

# 3

seefan

直接用map吧,效率不差

# 4

snake117

@yinziyang php的array就是map啊

# 5

David

@yinziyang PHP 的 in_array 就是遍历的吧

# 6

zxsz4084

楼主,最后怎么处理了呢?

# 7

hejiajie1989

slice和array没有这种方法

# 9

golllllllang

PHP的 in_array和array_search都是将map或者数组遍历一遍然后查询指定值

PHP的数组结构和哈希表是互相转换的.如果key全部为索引则为数组,反则转换为map,可以说PHP实现了一个map+双向链表

想O(1)查询指定值 推荐使用map

# 10