我有一个结构体切片。
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}]
我怎样才能搜索这个数组来得到元素where key="key1"
?
8条答案
按热度按时间oug3syen1#
从Go语言1.18开始,它增加了泛型支持,有一个
golang.org/x/exp/slices
包,其中包含一个名为slices.IndexFunc()
的泛型"find"函数:IndexFunc返回满足f(s [i])的第一个索引i,如果没有索引i,则返回-1。
利用它:
在Go Playground上试试。
在Go语言1.18之前,如需更快的替代方法,请阅读:
使用一个简单的
for
循环:注意,由于切片的元素类型是
struct
(不是指针),如果结构体类型是"big",则这可能是低效的,因为循环会将每个访问过的元素复制到循环变量中。只在索引上使用
range
循环会更快,这样可以避免复制元素:这取决于您的情况,是否存在多个配置具有相同的
key
,但如果不存在,则在找到匹配项时应将break
排除在循环之外(以避免搜索其他配置)。同样,如果这是一个频繁的操作,你应该考虑从它构建一个
map
,你可以简单地索引,例如。bpzcxfmw2#
您可以使用
sort.Slice()
加上sort.Search()
参见:https://play.golang.org/p/47OPrjKb0g_c
368yc8dk3#
通过将结构体
Key
和Value
组件与Map上的虚构键和值部分进行匹配,可以将结构体保存到Map中:然后使用golang comma ok 习惯用法,您可以测试键是否存在:
cnh2zyt34#
没有库函数可以实现这个功能,你必须自己编写代码。
工作代码:https://play.golang.org/p/IJIhYWROP_
k3fezbri5#
如果有人像我一样来自Java或C#,这就是我最终所做的:
我能够在这些函数的帮助下运行该代码:
um6iljoc6#
正如其他人之前评论的那样,你可以用匿名函数编写自己的过程来解决这个问题。
我用了两种方法来解决它:
使用示例:
计算成本较低的第二种方法:
使用示例:
csbfibhn7#
下面是一个基于@Tarion答案的简单函数。
js4nwp548#
检查切片中的每个元素,包括子字符串。不区分大小写。
https://go.dev/play/p/m5UAgbvPbbR