Go 在切片上循环,如果不存在则退出
我正在尝试创建一个循环,该循环将执行以下操作: 循环将在一个切片中逐个搜索所有项目:Go 在切片上循环,如果不存在则退出,go,Go,我正在尝试创建一个循环,该循环将执行以下操作: 循环将在一个切片中逐个搜索所有项目: 如果字母不存在,则继续循环的下一项 如果该字母存在,则退出循环 如果切片中没有匹配项,则退出操作系统 下面是我正在尝试的代码: userDefinedletter := "g" letters := []string{"a", "b", "c", "d"} for _, a := range let
userDefinedletter := "g"
letters := []string{"a", "b", "c", "d"}
for _, a := range letters{
if a != userDefinedletter {
continue
} else if a == userDefinedletter {
fmt.Printf("letter %s found. \n", userDefinedletter)
break
} else {
fmt.Println("letter not found in the slice")
os.Exit(1)
}
}
您的方向是正确的,但是对于这样一个小的函数,您已经做了不必要的嵌套,这是您本可以避免的
func present(切片[]字符串,查找字符串)bool{
对于z,s:=范围切片{
如果s==find{
返回真值
}
}
返回错误
}
func main(){
切片:=[]字符串{“a”、“b”、“c”、“d”}
查找:=“g”
如果!存在(切片,查找){
操作系统退出(1)
}
fmt.Printf(“在切片%v中找到%s\n”,找到,切片)
}
将变量设置为false。在循环中,如果找到字母,则将变量设置为true。循环后,检查变量以确定是否找到字母:
ok := false
for _, a := range letters {
if a == userDefinedletter {
ok = true
break
}
}
if ok {
fmt.Printf("letter %s found. \n", userDefinedletter)
} else {
fmt.Println("letter not found in the slice")
os.Exit(1)
}
我认为我们可以很容易地解决您的问题,就像这样:只需检查字母是否在幻灯片中,并获得字母包含在切片中时的位置
主程序包
进口(
“fmt”
“字符串”
)
func main(){
切片:=[]字符串{“a”、“b”、“c”、“d”}
查找:=“g”
如果pos:=strings.Index(strings.Join(slice,“”),则查找);pos!=-1{
fmt.Println(“切片不包含字母”)
}否则{
fmt.Println(“字母在切片中,位置为:”,位置)
}
}
您可以在线在此链接中快速测试上述代码:因为字母是按排序的,所以您可以使用:
i:=sort.searchString(字母,userDefinedletter)
如果i
这很有效!非常感谢。但是,不带函数也可以吗?我把问题留给你。我只是想给你一个方向。最好你自己去发现!为什么要把这么简单的任务搞得复杂呢。连接字符串片段并使用strings.Index
查找索引与通过循环查找元素相同,但需要额外操作。为什么?既然图书馆已经做了一件简单的工作,为什么还要再做一次呢?只需要了解库的功能并使用它。我的代码简短明了。当您在github中引用该函数时,您可以重新实现它:您不必给出引用;使用围棋的每个人都知道这个软件包是开源的。关键是您连接了字符串,并且仍然在捍卫该方法。仅为了使用strings包中的函数,您正在执行不必要的操作,以便可以使用strings.Index
。注意:这是一个简单的线性搜索。这里:(PresentTwo是你的函数,PresentOne是我写的函数)。现在看看基准测试。您的代码花费的时间是4x,但每次运算使用8B,并生成1个alloc/op,其中作为更简单的函数执行0个B/op和0个alloc/op。请不要在没有基准测试的情况下进行评论<代码>BenchmarkPresentTwo-8 10967002 108 ns/op 8 B/op 1 allocs/op-------------------------------//BenchmarkPresentOne-8 35317174 32.7 ns/op 0 B/op 0 allocs/op
干得好,请为我详细解释。是的,你说得对,我的方法使这个问题复杂化了。顺便说一句,你能和我分享一下golang的基准测试文档吗?这就是我需要的!谢谢,如果没有提到,就不要认为它已经分类了。
i := sort.SearchStrings(letters, userDefinedletter)
if i < len(letters) && letters[i] == userDefinedletter {
fmt.Printf("letter %s found. \n", userDefinedletter)
} else {
fmt.Println("letter not found in the slice")
os.Exit(1)
}