web-dev-qa-db-fra.com

Golang peut-il multiplier des chaînes comme Python peut?

Python peut multiplier des chaînes comme ceci:

Python 3.4.3 (default, Mar 26 2015, 22:03:40)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> x = 'my new text is this long'
>>> y = '#' * len(x)
>>> y
'########################'
>>>

Golang peut-il faire l'équivalent d'une manière ou d'une autre?

46
Duke Dougal

Il a une fonction au lieu d'un opérateur, strings.Repeat . Voici un port de votre Python, que vous pouvez exécuter ici :

package main

import (
    "fmt"
    "strings"
    "unicode/utf8"
)

func main() {
    x := "my new text is this long"
    y := strings.Repeat("#", utf8.RuneCountInString(x))
    fmt.Println(x)
    fmt.Println(y)
}

Notez que j'ai utilisé utf8.RuneCountInString(x) au lieu de len(x) ; le premier compte les "runes" (points de code Unicode), tandis que le dernier compte les octets. Dans le cas de "my new text is this long", La différence n'a pas d'importance puisque tous les caractères ne sont qu'un octet, mais il est bon de prendre l'habitude de spécifier ce que vous voulez dire:

len("ā") //=> 2
utf8.RuneCountInString("ā") //=> 1

(In Python 2, len compte les octets sur les chaînes simples et les runes sur les chaînes Unicode (u'...')):

>>> len('ā') #=> 2
>>> len(u'ā') #=> 1

Dans Python 3, les chaînes simples sont les chaînes Unicode et len compte les runes; si vous voulez compter les octets, vous devez d'abord encoder la chaîne en bytearray :

>>> len('ā') #=> 1
>>> len('ā'.encode('utf-8')) #=> 2

Dans Go, il n'y a qu'un seul type de chaîne. Vous n'avez donc pas à convertir, mais vous devez choisir la fonction qui correspond à la sémantique souhaitée.)

80
Mark Reed

Oui, c'est possible, mais pas avec un opérateur mais avec une fonction dans la bibliothèque standard.

Ce serait très facile avec une simple boucle, mais la bibliothèque standard vous en fournit une version hautement optimisée: strings.Repeat() .

Votre exemple:

x := "my new text is this long"
y := strings.Repeat("#", len(x))
fmt.Println(y)

Essayez-le sur le Go Playground .

Remarques: len(x) est la longueur "octets" (nombre d'octets) de la chaîne (dans le codage UTF-8, c'est ainsi que Go stocke les chaînes en mémoire). Si vous voulez le nombre de caractères (runes), utilisez utf8.RuneCountInString() .

13
icza

Ouaip. Le package de chaînes a une fonction Repeat .

2
ShadowRanger