จะทำดัชนีอักขระในสตริง Golang ได้อย่างไร?


101

จะรับเอาต์พุต "E" มากกว่า 69 ได้อย่างไร?

package main

import "fmt"

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

Golang มีฟังก์ชันในการแปลงถ่านเป็นไบต์หรือไม่และในทางกลับกัน?

คำตอบ:


150

ลิเทอรัลสตริงที่ตีความหมายคือลำดับอักขระระหว่างเครื่องหมายคำพูดคู่ "" โดยใช้การเข้ารหัส UTF-8 (อาจเป็นหลายไบต์) ของอักขระแต่ละตัว ใน UTF-8 อักขระ ASCII เป็นไบต์เดียวที่สอดคล้องกับอักขระ Unicode 128 ตัวแรก สตริงทำงานเหมือนชิ้นส่วนของไบต์ รูนคือค่าจำนวนเต็มที่ระบุจุดรหัส 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 Blog: สตริงไบต์รูนและอักขระใน Go


19

แล้วเรื่องนี้ล่ะ?

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

ดังที่ปีเตอร์ชี้ให้เห็นเพื่อให้ได้มากกว่า 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กำหนดรูปแบบการทำงานสำหรับประเภทจำนวนเต็มใด ๆ



4

string("HELLO"[1])การแก้ปัญหาทั่วไปที่จะตีความถ่านเป็นสตริงคือ

โซลูชันของ Rich ก็ใช้ได้ผลเช่นกัน


0

ลองทำเช่นนี้เพื่อให้ได้ charecters ตามดัชนี

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.