Le blog Golang étage: p>
"Une tranche peut également être formée par" trancher "une tranche ou une matrice existante. Tranchement est effectué en spécifiant une plage demi-ouverte avec deux indices séparés par un côlon. Par exemple, l'expression b [1: 4] crée une tranche comprenant des éléments 1 à 3 de B (les indices de la tranche résultante seront de 0 à 2). " P>
Quelqu'un peut-il vous expliquer la logique ci-dessus. C'EST À DIRE. Pourquoi pas B [1: 4] Éléments de référence 1 à 4? Est-ce compatible avec d'autres arrayes référencées? P>
4 Réponses :
Go utilise Intervalles de demi-ouverture pour des tranches comme de nombreuses autres langues. Dans une notation plus mathématique, la tranche B [1: 4] code> est l'intervalle [1,4) code> qui exclut le point d'extrémité supérieur. P>
Un avantage (mineur) est que vous savez qu'il a (4-1) = 3 éléments dedans.
Les intervalles à moitié ouverts ont du sens pour de nombreuses raisons, lorsque vous vous en sortez. Par exemple, avec un intervalle demi-ouvert comme celui-ci, le nombre d'éléments est le suivant: une formule assez agréable et facile. Pour un intervalle fermé, ce serait: p> qui est (pas beaucoup, mais toujours) plus compliqué. P> Cela signifie également que pour par exemple. Une chaîne, la chaîne entière est [1, len (s)] code> qui semble également intuitif. Si l'intervalle était fermé, pour obtenir la chaîne entière, vous auriez besoin de [1, len (s) + 1] code>. P> p>
La définition d'un système à intervalles fermée ne serait-elle pas pour obtenir la chaîne entière [1, Len (s) - 1]?
@ CHAOS95: Je ne pense pas ... alors la longueur de la chaîne serait (Len (s) - 1) - 1 + 1 qui est len (s) - 1, une contradiction.
@ CHAOS95 @UNWIND Vous avez tous les deux mal; Vérifiez vos formules de longueur. Pour un intervalle demi-ouvert, les limites de la chaîne entière sont [0, Len (s)] (0-indexé) ou [1, Len (s) +1] (1-indexé). Pour un intervalle fermé, les limites sont [0, len (s) - 1] (0-indexé) ou [1, Len (s)] (1-indexé).
La raison est donnée dans la section GO LIGNE SPECIFICATION SUR tranches .
pour une chaîne, une matrice ou une tranche a, le expression primaire p>
a[low : high]
index pointe sur le "Démarrer" de l'élément. Ceci est partagé par toutes les langues utilisant une indexation zéro basée sur zéro: Il est également courant de prendre en charge l'indexation négative, bien que go n'autorise pas ceci: P> |-6 | |-5 | |-4 | |-3 | |-2 | |-1 |
| 0 | first | 1 | second | 2 | third | 3 | fourth | 4 | fifth | 5 |
même chose en python. b [1: 4] est des éléments 1 à 3
Voir aussi: Dijkstra sur pourquoi les indices de tableau doivent commencer à 0.
@nmichaels plus pertinents, Dijkstra explique dans cette note pourquoi la limite supérieure d'une tranche devrait être exclusive: si elle ne l'étant pas, nous devrions exprimer la tranche vide comme [0: -1]. Il note également d'autres avantages: la différence entre les limites est la longueur de la tranche et des tranches adjacentes ont une limite supérieure d'un == limité inférieure de la suivante.