如何删除字符串的第一个字符?

时间:2018-02-15 00:49:59

标签: string go

删除字符串第一个字符的建议方法是什么?

我查看了字符串方法的文档但我没有看到任何像javascript' String.slice()那样有效的内容。

4 个答案:

答案 0 :(得分:14)

在Go中,字符string是UTF-8编码的Unicode代码点。 UTF-8是可变长度编码。

  

The Go Programming Language Specification

     

For statements

     

对于带有范围子句

的语句      

对于字符串值,"范围"子句迭代Unicode代码   从字节索引0开始的字符串中的点。连续   迭代时,索引值将是第一个字节的索引   连续的UTF-8编码的代码点在字符串中,第二个   符号类型的值将是相应代码的值   点。如果迭代遇到无效的UTF-8序列,则   第二个值将是0xFFFD,Unicode替换字符,和   下一次迭代将在字符串中前进一个字节。

例如,

package main

import "fmt"

func trimLeftChar(s string) string {
    for i := range s {
        if i > 0 {
            return s[i:]
        }
    }
    return s[:0]
}

func main() {
    fmt.Printf("%q\n", "Hello, 世界")
    fmt.Printf("%q\n", trimLeftChar(""))
    fmt.Printf("%q\n", trimLeftChar("H"))
    fmt.Printf("%q\n", trimLeftChar("世"))
    fmt.Printf("%q\n", trimLeftChar("Hello"))
    fmt.Printf("%q\n", trimLeftChar("世界"))
}

游乐场:https://play.golang.org/p/t93M8keTQP_I

输出:

"Hello, 世界"
""
""
""
"ello"
"界"

或者,对于更一般的功能,

package main

import "fmt"

func trimLeftChars(s string, n int) string {
    m := 0
    for i := range s {
        if m >= n {
            return s[i:]
        }
        m++
    }
    return s[:0]
}

func main() {
    fmt.Printf("%q\n", trimLeftChars("", 1))
    fmt.Printf("%q\n", trimLeftChars("H", 1))
    fmt.Printf("%q\n", trimLeftChars("世", 1))
    fmt.Printf("%q\n", trimLeftChars("Hello", 1))
    fmt.Printf("%q\n", trimLeftChars("世界", 1))
    fmt.Println()
    fmt.Printf("%q\n", "Hello, 世界")
    fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 0))
    fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 1))
    fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 7))
    fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 8))
    fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 9))
    fmt.Printf("%q\n", trimLeftChars("Hello, 世界", 10))
}

游乐场:https://play.golang.org/p/ECAHl2FqdhR

输出:

""
""
""
"ello"
"界"

"Hello, 世界"
"Hello, 世界"
"ello, 世界"
"世界"
"界"
""
""

参考文献:

The Go Programming Language Specification

Unicode UTF-8 FAQ

The Unicode Consortium

答案 1 :(得分:11)

假设问题使用“character”来引用Go调用的rune,然后使用utf8.DecodeRuneInString获取第一个符文的大小然后切片:

func trimFirstRune(s string) string {
    _, i := utf8.DecodeRuneInString(s)
    return s[i:]
}

playground example

正如peterSO在他的评论中链接的游乐场示例中所示,字符串上的范围也可用于查找第一个符文结束的位置:

func trimFirstRune(s string) string {
    for i := range s {
        if i > 0 {
            // The value i is the index in s of the second 
            // rune.  Slice to remove the first rune.
            return s[i:]
        }
    }
    // There are 0 or 1 runes in the string. 
    return ""
}

答案 2 :(得分:1)

另一个选项是 utf8string 包:

package main
import "golang.org/x/exp/utf8string"

func main() {
   s := utf8string.NewString("?????")
   t := s.Slice(1, s.RuneCount())
   println(t == "????")
}

https://pkg.go.dev/golang.org/x/exp/utf8string

答案 3 :(得分:-1)

这对我有用:

package main

import "fmt"

func main() {
    input := "abcd"
    fmt.Println(input[1:])    
}

输出是:

bcd

Go Playground上的代码:https://play.golang.org/p/iTv7RpML3LO