Programmiersprache Go: Seltsame Slices

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Programmiersprache Go: Seltsame Slices

Beitrag von heisenberg » 01.04.2020 02:24:26

Hi,

weil ich ja immer wieder höre, dass PHP so'n Dreck ist, habe ich mir mal ein Go-Tutorial angeschaut, ob das was taugt. Dabei ist mir sofort eine ziehmliche Seltsamkeit aufgefallen in Bezug auf Arrays bzw. Slices, was eine Art dynamisches Array ist oder auch ein Teil der Elemente eines Arrays.

Grundsätzlich wird bei Go-Arrays ab 0 begonnen zu zählen.

a) Wir haben ein Array bzw. Slice

Das Slice enthält 5 Werte 1,2,3,4,5 mit den Indizies 0 bis 4.

Code: Alles auswählen

numbers := []int{1, 2, 3, 4, 5}
b) Jetzt möchte ich einen Teil des Arrays als weiteres Slice ansprechen/ausgeben:

Code: Alles auswählen

fmt.Println(numbers[1:3])
Preisfrage: Wieviele und welche Elemente hat das obige Slice?

Ich hätte eines der folgenden Dinge erwartet:
  • das 1., 2. und 3. Element wäre also hier 1,2,3
  • das Element mit den Indizies 1,2,3 dann ist das also 2,3,4
  • ab dem 1. Element drei Werte, also wieder 1,2,3
  • ab dem Element mit dem Index 1 drei Werte, auch wieder 2,3,4
Tatsächlich richtige Antwort ist: Es enthält die Werte 2,3.

Ist das allen Ernstes die Syntax?

Code: Alles auswählen

[Nr. des ersten Elements, Nummer des nachfolgenden Elementes, das ich nicht mehr haben möchte]
Da krieg' ich echt Knoten im Hirn, wenn ich das anschaue.

Wahrscheinlich ist mit der Zahl die Anfangsadresse des Speicherplatzes des jeweiligen Indexes gemeint. Anfangsadresse 2(=der Wert bei dem das Feld mit Index 2 beginnt) bis Anfangsadresse 4(=Endadresse von Feld mit Index 3) enthält genau den die Werte 2 und 3.

Aber das ist jetzt mal echt gewöhnungsbedürftig. Daran merkt man wahrscheinlich, dass ich mit Sprachen wie C eher nix zu tun habe und tendenziell nur Scriptsprachen nutze.

cronoik
Beiträge: 2049
Registriert: 18.03.2012 21:13:42
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Programmiersprache Go: Seltsame Slices

Beitrag von cronoik » 01.04.2020 03:19:28

Du fragst halt [Beginnindex:Endindex) (beachte das es sich hierbei um ein rechtsoffenes Intervall handelt).
  • [ bedeutet Indexwert ist enthalten.
  • ) bedeutet Indexwert ist nicht enthalten.
Die Anfrage [1:3] bedeutet also gib mir die Werte beginnend von Index 1 bis zum Index 3.
Bei Python ist das auch so:

Code: Alles auswählen

>>> l = [1,2,3,4,5]
>>> l[1:3]
[2, 3]
Hilf mit unser Wiki zu verbessern!

Benutzeravatar
paedubucher
Beiträge: 932
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Programmiersprache Go: Seltsame Slices

Beitrag von paedubucher » 08.04.2020 13:16:51

Edsger W. Dijkstra (EWD831) liefert da eine sehr gute Begründung dafür. Zu deinem Problem: die Anzahl Elemente des Ausdrucks [a:b] findest du raus, indem du b-a rechnest. Das die Untergrenze inklusiv und die Obergrenze exklusiv ist, ist vielleicht nicht immer intuitiv, aber bei näherer Betrachtung doch sehr sinnvoll.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Antworten