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

建议删除字符串首字符的方法是什么?</ p>

我已经阅读了有关字符串方法的文档,但没有看到像javascript的 String.slice()。</ p>
</ div>

展开原文

原文

建议删除字符串首字符的方法是什么? 我已经阅读了有关字符串方法的文档,但没有看到像javascript的String.slice()一样有效的方法。

duanpuchun5275
duanpuchun5275 确实。使用zjw复合字形,甚至变得更加困难(几乎不可能?)。
2 年多之前 回复
douxuqiao6394
douxuqiao6394 如果您的字符串是ASCII,“µñ”[1:]不能按预期工作,将可以解决问题。
2 年多之前 回复
dongwo1914
dongwo1914 在这里看看dotnetperls.com/substring-go
2 年多之前 回复
doulie0178
doulie0178 没有针对每个问题的“最佳”解决方案。str[1:]可以解决问题。
2 年多之前 回复

3个回答

Assuming that the question uses "character" to refer to what Go calls a rune, then use utf8.DecodeRuneInString to get the size of the first rune and then slice:

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

playground example

As peterSO demonstrates in the playground example linked from his comment, range on a string can also be used to find where the first rune ends:

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 ""
}
douyue8364
douyue8364 好问题。 如果要修剪的字符是已知的字符串,那么TrimLeft()而不是符文的数量对我来说效果最好。
一年多之前 回复
dongsong4418
dongsong4418 尽管trimFirstRune是正确的,但它的效率似乎不及trimLeftChar和trimLeftChars:play.golang.org/p/ZOZyRORkK82。 请参阅utf8.DecodeRuneInString的源代码。
2 年多之前 回复

In Go, character strings are UTF-8 encoded Unicode code points. UTF-8 is a variable-length encoding.

The Go Programming Language Specification

For statements

For statements with range clause

For a string value, the "range" clause iterates over the Unicode code points in the string starting at byte index 0. On successive iterations, the index value will be the index of the first byte of successive UTF-8-encoded code points in the string, and the second value, of type rune, will be the value of the corresponding code point. If the iteration encounters an invalid UTF-8 sequence, the second value will be 0xFFFD, the Unicode replacement character, and the next iteration will advance a single byte in the string.

For example,

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
", "Hello, 世界")
    fmt.Printf("%q
", trimLeftChar(""))
    fmt.Printf("%q
", trimLeftChar("H"))
    fmt.Printf("%q
", trimLeftChar("世"))
    fmt.Printf("%q
", trimLeftChar("Hello"))
    fmt.Printf("%q
", trimLeftChar("世界"))
}

Playground: https://play.golang.org/p/t93M8keTQP_I

Output:

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

Or, for a more general function,

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
", trimLeftChars("", 1))
    fmt.Printf("%q
", trimLeftChars("H", 1))
    fmt.Printf("%q
", trimLeftChars("世", 1))
    fmt.Printf("%q
", trimLeftChars("Hello", 1))
    fmt.Printf("%q
", trimLeftChars("世界", 1))
    fmt.Println()
    fmt.Printf("%q
", "Hello, 世界")
    fmt.Printf("%q
", trimLeftChars("Hello, 世界", 0))
    fmt.Printf("%q
", trimLeftChars("Hello, 世界", 1))
    fmt.Printf("%q
", trimLeftChars("Hello, 世界", 7))
    fmt.Printf("%q
", trimLeftChars("Hello, 世界", 8))
    fmt.Printf("%q
", trimLeftChars("Hello, 世界", 9))
    fmt.Printf("%q
", trimLeftChars("Hello, 世界", 10))
}

Playground: https://play.golang.org/p/ECAHl2FqdhR

Output:

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

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

References:

The Go Programming Language Specification

Unicode UTF-8 FAQ

The Unicode Consortium

dongmieqiao3152
dongmieqiao3152 Unicode标准对此进行了全部解释:unicode.org/versions/Unicode10.0.0/UnicodeStandard-10.0.pdf
2 年多之前 回复
dongxie5698
dongxie5698 代码点不必是字符。 考虑将字符,RLM或已死的丑陋/愚蠢的BOM组合在一起。
2 年多之前 回复
dongtuwu8548
dongtuwu8548 我很小心地使用单词字符(代码点),而不是字形。 我只答应了trimLeftChars,而不是trimLeftGlyphs。
2 年多之前 回复
dqdes60666
dqdes60666 这就是我的意思:它是一个字形,因此trimLeftChars(s,1)应该将其完全删除。 (如果您使用的是Linux,请尝试在具有最新操作系统或其他操作系统(windows / mac)的手机上查看是否正确渲染-将这4个代码点合并为一个字形)
2 年多之前 回复
dongtangu6889
dongtangu6889 ðŸ'â€âš•ï¸Man Health Worker:play.golang.org/p/qgloqE1a4az
2 年多之前 回复
duanqian6982
duanqian6982 (免责声明:我不是挑剔的人(我已经+1了你),我知道这是一个复杂的问题,不确定是否可以用少于几十/几百千字节的代码来解决。) 它们的字符含义实际上是“字形”,然后类似ðŸ'¨ðŸ»–―â€的东西将很难正确处理。
2 年多之前 回复



这对我有用:</ p>

  package main 

import“ fmt”

func main(){
输入:=“ abcd”
fmt.Println(input [1:])
}
</ code> </ pre>

输出为 :</ p>

  bcd 
</ code> </ pre>

Go操场上的代码: https://play.golang.org/p/iTv7RpML3LO </ p>
</ div>

展开原文

原文

This works for me:

package main

import "fmt"

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

Output is:

bcd

Code on Go Playground: https://play.golang.org/p/iTv7RpML3LO

dtxf759200
dtxf759200 好点,我没有测试像µ这样的unicode字符。 下次我会记住这一点。
2 年多之前 回复
douqiang6448
douqiang6448 但这通常不起作用,请考虑输入:=“ µabcd”时会发生什么。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问