猿问

如何将跟随者字符连接到字符串,直到在 Golang 中达到定义的最大长度?

InputOutput

abc    abc___

a        a___    

abcdeabcde_


试图


package main


import "fmt"

import "unicode/utf8"


func main() {

    input := "abc"


    if utf8.RuneCountInString(input) == 1 {

        fmt.Println(input + "_____")

    } else if utf8.RuneCountInString(input) == 2 {

        fmt.Println(input + "____")

    } else if utf8.RuneCountInString(input) == 3 {

        fmt.Println(input + "___")

    } else if utf8.RuneCountInString(input) == 4 {

        fmt.Println(input + "__")

    } else if utf8.RuneCountInString(input) == 5 {

        fmt.Println(input + "_")

    } else {

        fmt.Println(input)

    }

}

回报


abc___

讨论


尽管代码正在创建预期的输出,但它看起来非常冗长和狡猾。



有没有简洁的方法?


达令说
浏览 142回答 3
3回答

慕桂英4014372

该字符串封装具有Repeat的功能,所以像input += strings.Repeat("_", desiredLen - utf8.RuneCountInString(input))会更简单。您应该首先检查它desiredLen是否小于输入长度。

蛊毒传说

您还可以通过切片准备好的“最大填充”(切出所需的填充并将其添加到输入中)来有效地执行此操作,而无需循环和“外部”函数调用:const max = "______"func pad(s string) string {&nbsp; &nbsp; if i := utf8.RuneCountInString(s); i < len(max) {&nbsp; &nbsp; &nbsp; &nbsp; s += max[i:]&nbsp; &nbsp; }&nbsp; &nbsp; return s}使用它:fmt.Println(pad("abc"))fmt.Println(pad("a"))fmt.Println(pad("abcde"))输出(在Go Playground上试试):abc___a_____abcde_笔记:len(max)是常数(因为max是常数):规格:长度和容量:表达len(s)是常数,如果s是字符串常量。切片 astring是有效的:这种类似切片的字符串设计的一个重要结果是创建子字符串非常有效。所需要做的就是创建一个两个字的字符串标题。由于字符串是只读的,原始字符串和切片操作产生的字符串可以安全地共享同一个数组。

神不在的星期二

你可以input += "_"在一个循环中完成,但这会分配不必要的字符串。这是一个不会分配超过其需要的版本:const limit = 6func f(s string) string {&nbsp; &nbsp; if len(s) >= limit {&nbsp; &nbsp; &nbsp; &nbsp; return s&nbsp; &nbsp; }&nbsp; &nbsp; b := make([]byte, limit)&nbsp; &nbsp; copy(b, s)&nbsp; &nbsp; for i := len(s); i < limit; i++ {&nbsp; &nbsp; &nbsp; &nbsp; b[i] = '_'&nbsp; &nbsp; }&nbsp; &nbsp; return string(b)}游乐场:http : //play.golang.org/p/B_Wx1449QM。
随时随地看视频慕课网APP

相关分类

Go
我要回答