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

160
如何获得一个"E"的输出,而不是69?
package main

import "fmt"

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

Golang有将字符转换为字节和将字节转换为字符的函数吗?

10个回答

228
解释性字符串字面量是双引号 "" 之间的字符序列,使用单个字符的(可能是多字节的)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博客:Go中的字符串、字节、符文和字符


28

这个怎么样?this

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

作为Peter指出的,为了允许不仅限于ASCII码:
fmt.Printf("%c", []rune("HELLO")[1])

那么没有办法编程吗? 例如,如果我将1000000个字符转换为符文,则需要1000000*4 = 4000000字节的内存。 utf-8对于ASCII字符使用1个字节。但是每个字符的符文使用4个字节。这意味着可以节省大量内存。 我猜这需要位编码,但对于大文本来说这是值得的。 - SeanTolstoyevski

17

也可以通过切片完成

package main

import "fmt"

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

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


3
这仅适用于单字节编码,尝试使用"हैलो"[:1]会返回�。 - vladkras
@vladkras 您是正确的。它只适用于ASCII。对于UTF-8,请查看批准的答案。我还将使用此信息编辑解决方案。 - Samkit Jain

16

您也可以尝试将其强制转换为字符串。

package main

import "fmt"

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

9

Go语言本身并没有字符类型。byte通常用于ASCII字符,rune用于Unicode字符,但它们都只是整数类型的别名(uint8和int32)。因此,如果您想要将它们强制输出为字符而不是数字,则需要使用Printf("%c", x)%c格式规范适用于任何整数类型。


6

将一个字符解释为字符串的常规方法是 string("HELLO"[1])

当然,Rich的方法也有效。


3
尝试按它们的索引获取字符:
package main

import (
      "fmt"
      "strings"
)

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

2

字符串中的字符是符文,所以要打印它们,你必须将它们转换回字符串。

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

这行代码输出的是 "E"。

-2

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

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]))

// = 注释行


12
非常糟糕的代码,如果输入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

-6

解决方案将是:

 package main

 import "fmt"

func main() {
  str := "HELLO"
  string(str[0])//H
  string(str[1])//E
  string(str[2])//L
  string(str[3])//L
  string(str[4])//O
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接