7
votes

Golang Array référençant, par exemple. B [1: 4] Références Éléments 1,2,3

Le blog Golang étage:

"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). "

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?

go

3 commentaires

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.


4 Réponses :


2
votes

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] est l'intervalle [1,4) qui exclut le point d'extrémité supérieur.


1 commentaires

Un avantage (mineur) est que vous savez qu'il a (4-1) = 3 éléments dedans.



4
votes

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: xxx

une formule assez agréable et facile. Pour un intervalle fermé, ce serait: xxx

qui est (pas beaucoup, mais toujours) plus compliqué.

Cela signifie également que pour par exemple. Une chaîne, la chaîne entière est [1, len (s)] qui semble également intuitif. Si l'intervalle était fermé, pour obtenir la chaîne entière, vous auriez besoin de [1, len (s) + 1] .


3 commentaires

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é).



4
votes

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]


0 commentaires

9
votes

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: xxx pré>

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 |


0 commentaires