如何索引Golang字符串中的字符?


100

如何获得“ E”输出而不是69?

package main

import "fmt"

func main() {
    fmt.Print("HELLO"[1])
}

Golang是否具有将字符转换为字节,反之亦然的功能?

Answers:


149

解释的字符串文字是使用单个字符的UTF-8编码(可能是多字节)在双引号“”之间的字符序列。在UTF-8中,ASCII字符是单字节,对应于前128个Unicode字符。字符串的行为类似于字节片。符文是标识Unicode代码点的整数值。因此,

package main

import "fmt"

func main() {
    fmt.Println(string("Hello"[1]))              // ASCII only
    fmt.Println(string([]rune("Hello, 世界")[1])) // UTF-8
    fmt.Println(string([]rune("Hello, 世界")[8])) // UTF-8
}

输出:

e
e
界

读:

进入转换的编程语言规范部分。

Go博客:Go中的字符串,字节,符文和字符


19

怎么样这个

fmt.Printf("%c","HELLO"[1])

正如Peter所指出的,不仅仅允许ASCII:

fmt.Printf("%c", []rune("HELLO")[1])

10

也可以通过切片来完成

package main

import "fmt"

func main() {
    fmt.Print("HELLO"[1:2])
}

注意:此解决方案仅适用于ASCII字符。


这仅适用于一个字节编码,尝试"हैलो"[:1]它给你
vladkras

@vladkras你是正确的。它仅适用于ASCII。对于UTF-8,请查看批准的答案。我还将使用此信息编辑解决方案。
Samkit Jain

7

Go并没有真正的字符类型。字节通常用于ASCII字符,而符文用于Unicode字符,但是它们都是整数类型(uint8和int32)的别名。因此,如果要强制将它们打印为字符而不是数字,则需要使用Printf("%c", x)。该%c格式规范适用于任何整数类型。


5

您也可以尝试使用字符串进行类型转换。

package main

import "fmt"

func main() {
    fmt.Println(string("Hello"[1]))
}

4

将char解释为字符串的一般解决方案是 string("HELLO"[1])

当然,Rich的解决方案也可以。


0

尝试此操作以按字符获取字符

package main

import (
      "fmt"
      "strings"
)

func main() {
   str := strings.Split("HELLO","")
    fmt.Print(str[1])
}

0

字符串字符是符文,因此要打印它们,必须将它们变回字符串。

fmt.Print(string("HELLO"[1]))


-3

隔离字符串中字符的另一种解决方案

package main
import "fmt"

   func main() {
        var word string = "ZbjTS"

       // P R I N T 
       fmt.Println(word)
       yo := string([]rune(word)[0])
       fmt.Println(yo)

       //I N D E X 
       x :=0
       for x < len(word){
           yo := string([]rune(word)[x])
           fmt.Println(yo)
           x+=1
       }

}

对于字符串数组:

fmt.Println(string([]rune(sArray[0])[0]))

// =注释行


11
真的,真的不好的代码将与Unicode输入(恐慌len("cafés")> len([]rune("cafés")),并可以重新转换在每个迭代,串O(N²)。只要做到for _, r := range word { fmt.Printf("%c", r) }。如果你真的想与指数环for x := 0; x < limit; x++在回答之前学习一门语言的基础知识问题
Dave C
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.