Вопрос об индексировании символов строк

# #string #go

Вопрос:

Ниже приведена программа, которую я создал, чтобы понять, как индексирование строковых символов работает в Go:

 package main

import "fmt"

func main() {
    vendor1 := "Cisco"
    fmt.Println(vendor1[0])  
    fmt.Println(vendor1[1:4]) 
    fmt.Println(vendor1[1:])  
    fmt.Println(vendor1[:])
}
 

Выход:

 C:GolangVARIABLE> go run .variable.go
67
isc
isco
Cisco
 

Что меня озадачило, так это то, что Println(vendor1[0]) возвращает число » 67 «вместо » C», почему это так? Почему он отличается от Println(поставщик 1[1:4]) , Println(поставщик 1[1:]) и Println(поставщик 1 [:]), которые все возвращают нужные символы?

Ответ №1:

Выражения индекса-это не то же самое, что выражения среза, не объединяйте их.

Индексирование, в отличие от нарезки, возвращает byte псевдоним типа uint8 и Println просто выводит целое число без знака.

Нарезка возвращает строку, поэтому Println выводит текст.

Комментарии:

1. Спасибо, я понял твою точку зрения. Я понял, что мне нужно использовать string() для преобразования байта в строку после индексирования.

Ответ №2:

Чтобы напечатать значение с индексом 0 ,используйте fmt.Printf("%cn", vendor1[0]) вместо fmt.Println(vendor1[0]) , для трех других значений, которые вы можете использовать %s , fmt.Printf() так как они являются строковыми.Я изменил ваш код следующим образом:

 package main

import (
    "fmt"
)

func main() {

    vendor1 := "Cisco"

    fmt.Printf("%cn", vendor1[0])

    fmt.Printf("%sn", vendor1[1:4])
    fmt.Printf("%sn", vendor1[1:])
    fmt.Printf("%sn", vendor1[:])

}
 

Выход:

 C
isc
isco
Cisco