len(s2) { " />
登录
首页 >  Golang >  Go问答

无法获得准确的结果使用len()函数

来源:stackoverflow

时间:2024-02-11 20:18:22 497浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《无法获得准确的结果使用len()函数》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

在字符串中连接“-”后,s1和s2的长度应该相同

package main
import . "fmt"

func stamp(s1 string, s2 string) (result string){
  if len(s1) > len(s2) {
    for i := 0; i < (len(s1) - len(s2)); i++{
      s2 += "-"
    }
  } else if len(s1) < len(s2) {
    for i := 0; i < (len(s2) - len(s1)); i++ {
      s1 += "-"
    }
  }

  for i := 0; i < len(s2); i++ {
    result += string(s1[i]) + string(s2[i])
  }
  return
}

func main(){
  var s1, s2 string
  print("insert 2 words: ")
  scan(&s1, &s2)
  println(stamp(s1,s2))
}

尝试将 s1 作为“esame” s2 作为“去” 邮票得到了egsoa-m- // 应该是egsoa-m-e-

尝试将 s2 作为“go” s1 为“esame” 得到邮票

panic: runtime error: index out of range [4] with length 4



goroutine 1 [running]:

main.stamp(...)

    /home/Usr/Info/es19.go:16

main.main()

    /home/Usr/Info/es19.go:25 +0x2ac

exit status 2

正确答案


这是一个常见的编程陷阱,即您不应在访问数组/切片时对其进行修改。在这种情况下,您尝试将“-”附加到 s1/s2,而 for 循环取决于 len(s1) 和 len(s2) 的减法。假设s1和s2的初始长度分别为2和5,delta为3,第一轮结束后,s1的长度变为3,i变为1,delta为2,继续循环。但是,在第二轮之后,s1 的长度变为 4,i 变为 2,delta 现在为 1,因此循环到此结束。您可能期望 3 轮,但结果是 2 轮。

更需要了解的是,go 的 len 函数是动态调用的。所以解决办法就是在for循环上方添加一行来保存初始长度增量,也就是下面的子行。我相信它会给你想要的。

if len(s1) > len(s2) {
                sub := len(s1) - len(s2)
                for i := 0; i < sub; i++ {
                        s2 += "-"
                }
        } else if len(s1) < len(s2) {
                sub := len(s2) - len(s1)
                for i := 0; i < sub; i++ {
                        s1 += "-"
                }
        }

到这里,我们也就讲完了《无法获得准确的结果使用len()函数》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>