当前位置: 首页 > 知识库问答 >
问题:

如何在Go语言切片中搜索元素

申黎明
2023-03-14

我有一个结构片。

type Config struct {
    Key string
    Value string
}

// I form a slice of the above struct
var myconfig []Config 

// unmarshal a response body into the above slice
if err := json.Unmarshal(respbody, &myconfig); err != nil {
    panic(err)
}

fmt.Println(config)

以下是此文件的输出:

[{key1 test} {web/key1 test2}]

如何搜索此数组以获取key=“key1”所在的元素?

共有3个答案

宦博雅
2023-03-14

通过将结构组件与其在地图上的虚拟键和值部分相匹配,可以将结构保存到地图中:

mapConfig := map[string]string{}
for _, v := range myconfig {
   mapConfig[v.Key] = v.Value
}

然后使用Go语言逗号ok习语,你可以测试关键的存在:

if v, ok := mapConfig["key1"]; ok {
    fmt.Printf("%s exists", v)
}   
都沈浪
2023-03-14

您可以使用排序。切片()plussort。搜索()

type Person struct {
    Name string
}

func main() {
    crowd := []Person{{"Zoey"}, {"Anna"}, {"Benni"}, {"Chris"}}

    sort.Slice(crowd, func(i, j int) bool {
        return crowd[i].Name <= crowd[j].Name
    })

    needle := "Benni"
    idx := sort.Search(len(crowd), func(i int) bool {
        return string(crowd[i].Name) >= needle
    })

    if idx < len(crowd) && crowd[idx].Name == needle {
        fmt.Println("Found:", idx, crowd[idx])
    } else {
        fmt.Println("Found noting: ", idx)
    }
}

见:https://play.golang.org/p/47OPrjKb0g_c

颜志学
2023-03-14

通过一个简单的for循环:

for _, v := range myconfig {
    if v.Key == "key1" {
        // Found!
    }
}

请注意,由于切片的元素类型是一个结构(不是指针),因此如果结构类型为“大”,这可能是低效的,因为循环会将每个访问的元素复制到循环变量中。

仅在索引上使用范围循环会更快,这样可以避免复制元素:

for i := range myconfig {
    if myconfig[i].Key == "key1" {
        // Found!
    }
}

笔记

这取决于您的情况,多个配置是否可以使用相同的键存在,但如果不存在,您应该在找到匹配项时将其从循环中断开(以避免搜索其他配置)。

for i := range myconfig {
    if myconfig[i].Key == "key1" {
        // Found!
        break
    }
}

此外,如果这是一个频繁操作,您应该考虑从代码中创建<代码> map >代码>,您可以简单地对其进行索引,例如

// Build a config map:
confMap := map[string]string{}
for _, v := range myconfig {
    confMap[v.Key] = v.Value
}

// And then to find values by key:
if v, ok := confMap["key1"]; ok {
    // Found
}

 类似资料:
  • 主要内容:从数组或切片生成新的切片,直接声明新的切片,使用 make() 函数构造切片切片(slice)是对数组的一个连续片段的引用,所以切片是一个引用类型(因此更类似于 C/ C++ 中的数组类型,或者 Python 中的 list 类型),这个片段可以是整个数组,也可以是由起始和终止索引标识的一些项的子集,需要注意的是,终止索引标识的项不包括在切片内。 Go语言中切片的内部结构包含地址、大小和容量,切片一般用于快速地操作一块数据集合,如果将数据集合比作切糕的话,切片就是你要的“

  • 主要内容:从开头位置删除,从中间位置删除,从尾部删除Go语言并没有对删除切片元素提供专用的语法或者接口,需要使用切片本身的特性来删除元素,根据要删除元素的位置有三种情况,分别是从开头位置删除、从中间位置删除和从尾部删除,其中删除切片尾部的元素速度最快。 从开头位置删除 删除开头的元素可以直接移动数据指针: 也可以不移动数据指针,但是将后面的数据向开头移动,可以用 append 原地完成(所谓原地完成是指在原有的切片数据对应的内存区间内完成,不会导致

  • Go 语言切片是对数组的抽象。 Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。 定义切片 你可以声明一个未指定大小的数组来定义切片: var identifier []type 切片不需要说明长度。 或使用make()函数来创建切片: var s

  • 本位主要介绍一下 Go 语言中可变长度的"数组"——切片(slice)。数组有数组的用处,但是其不可变长度的特性,注定了在大多场景下不是很受欢迎。在大多数场景下我们都会选择更加灵活的切片。 1. 切片的创建 切片的声明方式和数组类似,写法上看就是声明一个没有长度的数组:var 切片名 []切片类型。其中切片类型可以是切片本身,也就是切片的切片,就构成了多维的切片。 切片在使用之前必须要初始化,它没

  • Go语言中同样允许使用多维切片,声明一个多维数组的语法格式如下: var sliceName [][]...[]sliceType 其中,sliceName 为切片的名字,sliceType为切片的类型,每个 代表着一个维度,切片有几个维度就需要几个 。 下面以二维切片为例,声明一个二维切片并赋值,代码如下所示。 上面的代码也可以简写为下面的样子。 上面的代码中展示了一个包含两个元素的外层切片,同

  • Go语言的内置函数 copy() 可以将一个数组切片复制到另一个数组切片中,如果加入的两个数组切片不一样大,就会按照其中较小的那个数组切片的元素个数进行复制。 copy() 函数的使用格式如下: copy( destSlice, srcSlice []T) int 其中 srcSlice 为数据来源切片,destSlice 为复制的目标(也就是将 srcSlice 复制到 destSlice),目