【问题标题】:How to check if appended slice is equal to a string?如何检查附加的切片是否等于字符串?
【发布时间】:2017-06-15 17:16:15
【问题描述】:

所以计划是在切片中有一个字符串,例如“a”,一旦变成“a100”,然后停止运行一个在末尾添加数字的 for 循环。当我尝试下面的代码时,它显示“(不匹配的类型 [] 字符串和字符串)”,这是因为我必须将切片转换为字符串吗?如果是这样,我该怎么做?谢谢。

package main

import "fmt"

func main() {
    var s []string
    s = append(s, "a")
    fmt.Println(s)
    for i := 0; i <= 1000; i++ {
        s = append(s, i)
        if s == "a10" {
            fmt.Println("Worked", s)
        } else {
            fmt.Println(s)
        }
    }
}

【问题讨论】:

  • 我不确定你的计划是什么,但你最好使用 []byte 而不是 []string。
  • 最终结果是尝试创建类似于 nonce 的东西。因此,我将生成一个哈希并继续附加 1、2、3...123 等...(例如不是 0123)中的数字,直到哈希以 4 个 0 开头。

标签: string go slice


【解决方案1】:

您可以通过以下方式将[]string 转换为字符串:

import "strings"

//...

if strings.Join(s, "") == "a10" {
      fmt.Println("Worked", s)
} else {
      fmt.Println(s)
}

您还需要将i(一个整数)转换为string,很可能您会使用strconv.Itoa。最后,您的代码将如下所示:https://play.golang.org/p/gD5b5XFimJ

package main

import (
    "fmt"
    "strconv"
    "strings"
)

func main() {
    var s []string
    s = append(s, "a")
    fmt.Println(s)
    for i := 0; i <= 1000; i++ {
        s = append(s, strconv.Itoa(i))
        if strings.Join(s, "") == "a01" {
            fmt.Println("Worked", s)
            return
        } else {
            fmt.Println(s)
        }
    }
}

虽然,你也可以不使用数组直接附加到字符串(或 []byte)...

package main

import (
    "fmt"
    "strconv"
)

func main() {
    var s := "a"
    fmt.Println(s)
    for i := 0; i <= 1000; i++ {
        s += strconv.Itoa(i)
        if s == "a01" {
            fmt.Println("Worked", s)
            return
        } else {
            fmt.Println(s)
        }
    }
}

要每次重置数组,只需要main方法:

for i := 0; i <= 1000; i++ {
    s := []string{"a"}
    s = append(s, strconv.Itoa(i))
    if strings.Join(s, "") == "a10" {
        fmt.Println("Worked", s)
        return
    } else {
        fmt.Println(s)
    }
}

【讨论】:

  • 感谢您的回答,尽管我遗漏了我也需要将 i (int) 转换为字符串。你能用类似的方式做吗?
  • 感谢您更新评论。我忘记了我需要从切片中删除之前添加的 (i)。否则我会得到类似 [a 1 2 3] [a 1 2 3 4] 等的东西。而不是 [a 1] [a 2]
  • 请注意,strings.Join() 并不便宜,尤其是当切片开始变得很长或其中有很长的字符串时。它比使用+(或+=)附加要便宜得多,但字符串的不变性仍然意味着您要在每个单字节数组上分配一个全新的字节数组(大小等于字符串切片中长度的总和) strings.Join() 调用。
猜你喜欢
  • 1970-01-01
  • 2016-12-21
  • 2014-07-29
  • 2011-02-05
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 2022-01-04
  • 2019-10-10
相关资源
最近更新 更多