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

Que*_*son 11 string go

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

我查看了字符串方法的文档,但是我没有看到任何像javascript的String.slice()那样的函数.

pet*_*rSO 14

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

Go编程语言规范

对于陈述

对于带有范围子句的语句

为一个字符串值,在串中的Unicode码点"范围"的条款进行迭代开始于字节索引0.连续迭代,该指数值将是连续的UTF-8编码的码点的第一个字节的索引字符串和rune类型的第二个值将是相应代码点的值.如果迭代遇到无效的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("??"))
}
Run Code Online (Sandbox Code Playgroud)

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

输出:

"Hello, ??"
""
""
""
"ello"
"?"
Run Code Online (Sandbox Code Playgroud)

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

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))
}
Run Code Online (Sandbox Code Playgroud)

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

输出:

""
""
""
"ello"
"?"

"Hello, ??"
"Hello, ??"
"ello, ??"
"??"
"?"
""
""
Run Code Online (Sandbox Code Playgroud)

参考文献:

Go编程语言规范

Unicode UTF-8常见问题解答

Unicode联盟

  • (免责声明:我不是在挑剔(而且我已经+1了你),我知道这是一个复杂的问题,不确定是否有可能用少于几十/几百千字节的代码来解决它.鉴于OP没有解释他们用'字符'来表示它们实际上意味着"一个字形",那么像"⚕️"这样的东西真的很难处理. (3认同)

Cer*_*món 12

假设问题使用"character"来引用Go称为符文的内容,那么使用utf8.DecodeRuneInString来获取第一个符文的大小然后切片:

func trimFirstRune(s string) string {
    _, i := utf8.DecodeRuneInString(s)
    return s[i:]
}
Run Code Online (Sandbox Code Playgroud)

操场的例子


Vik*_*ote 7

这对我有用:

package main

import "fmt"

func main() {
    input := "abcd"
    fmt.Println(input[1:])    
}
Run Code Online (Sandbox Code Playgroud)

输出是:

bcd
Run Code Online (Sandbox Code Playgroud)

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

  • @muistooshort 好点,我没有测试像 `µ` 这样的 unicode 字符。下次我会记住的。 (7认同)
  • 但它通常不起作用,考虑一下当`input := "µabcd"` 时会发生什么。 (4认同)