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)
    }