Maison  >  Article  >  développement back-end  >  Octets et chaînes Golang

Octets et chaînes Golang

WBOY
WBOYavant
2024-02-09 09:00:29890parcourir

Golang 字节与字符串

l'éditeur php Youzi vous amènera à explorer en profondeur les octets et les chaînes de Golang. Dans Golang, les octets et les chaînes sont des types de données courants, mais il existe des différences subtiles et des méthodes de conversion entre eux. Comprendre ces différences et méthodes de conversion vous aidera à mieux traiter vos données et à optimiser les performances du programme. Cet article présentera les concepts d'octets et de chaînes, les méthodes de conversion mutuelle et leurs scénarios d'utilisation dans des applications pratiques, vous aidant à mieux comprendre et appliquer les octets et les chaînes dans Golang. Explorons ensemble !

Contenu de la question

J'essaie de trouver des éléments communs entre deux chaînes de longueur égale en golang.

L'élément est trouvé, mais la représentation sous forme de chaîne semble également contenir des valeurs en octets. Comment puis-je m'en débarrasser?

func main() {
    println(fmt.printf("common element = %s",
        findcommonelement("abcdefghi", "ijklmnopq")))
}

func findcommonelement(firstelements, secondelements string) string {
    elementsinfirstgroup := make(map[string]bool)
    for _, charvalue := range firstelements {
        elementsinfirstgroup[string(charvalue)] = true
    }
    for index := range firstelements {
        if _, ok := elementsinfirstgroup[string(secondelements[index])]; ok {
            matchingelem := secondelements[index]
            println(string(matchingelem))
            return string(matchingelem)
        }
    }

    panicmessage := fmt.sprintf("could not find a common item between %s and %s", firstelements, secondelements)
    panic(panicmessage)
}

Le résultat que j'obtiens est

i
common element = i18 (0x0,0x0)

Codez ici

Solution de contournement

Vous devez utiliser fmt.sprintf 而不是 fmt.printf.

Et évitez d'utiliser le println,而是使用 fmt.println intégré.

https://pkg.go.dev/[email protected]#printf

func printf(format string, a ...any) (n int, err error)

printf formate selon un spécificateur de format et écrit sur la sortie standard. Il renvoie le nombre d'octets écrits et les erreurs d'écriture rencontrées.

Donc 18 (0x0,0x0)...

    Nombre de caractères dans
  • 18 是字符串 "common element = i".
  • (0x0,0x0) 是由 println 打印的 nil Valeur d'erreur.

Plus important encore, votre algorithme est défectueux car il mélange des octets avec des runes. Quand tu fais range 时,迭代变量 charvalue 将被分配一个 rune,它可能是多字节的。但是,当您索引字符串(例如 secondelements[index])时,其结果始终是单个 byte sur une ficelle. Par conséquent, des paniques ou du charabia (octets invalides) seront inévitablement le résultat de votre fonction. Voir Exemple.

Vous pouvez obtenir de meilleurs résultats en procédant comme suit :

func findCommonElement(firstElements, secondElements string) string {
    second := map[rune]bool{}
    for _, r := range secondElements {
        second[r] = true
    }

    for _, r := range firstElements {
        if second[r] {
            fmt.Println(string(r))
            return string(r)
        }
    }

    panic("...")
}

https://www.php.cn/link/dbdc69ea6ccbdea0ca2d796e1af24ebf

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer