Heim  >  Artikel  >  Backend-Entwicklung  >  Slice gibt eine unerwartete Länge zurück

Slice gibt eine unerwartete Länge zurück

WBOY
WBOYnach vorne
2024-02-09 10:21:29683Durchsuche

Slice gibt eine unerwartete Länge zurück

php-Editor Youzi stößt häufig auf das Problem, dass bei Verwendung des Slicing-Vorgangs unerwartete Längen zurückgegeben werden. Die Slicing-Operation ist eine der am häufigsten verwendeten Array-Operationen. Sie können einige Elemente des Arrays erhalten, indem Sie die Startposition und die Endposition angeben. Manchmal stellen wir jedoch fest, dass die zurückgegebene Slice-Länge nicht den Erwartungen entspricht, was auf häufige Fehler oder Missverständnisse zurückzuführen sein kann. In diesem Artikel stellen wir die Probleme, die bei Slicing-Vorgängen auftreten können, ausführlich vor und stellen Lösungen bereit, die Ihnen helfen, Slicing-Vorgänge besser zu verstehen und zu verwenden.

Frageninhalt

Ich habe an Golang gearbeitet und habe aufgehört, weil es mich verwirrt hat.

package main

import "fmt"

func main() {
    month := [...]string{1: "jan", 2: "fab", 3: "march", 4: "april", 5: "may", 6: "june", 7: "july", 8: "aug", 9: "sep", 10: "oct", 11: "nov", 12: "dec"}
    fmt.println(cap(month))
    summer := month[6:9]
    q2 := month[4:7]
    fmt.println(cap(q2))
    fmt.println(len(q2))

    fmt.println(cap(summer))
    fmt.println(len(summer))
}

Die Ausgabe ist

13
9
3
7
3

Das Monatssegment hat 12 Elemente, aber cap(month) und len(month) geben 13 zurück, warum? cap(month)len(month) 返回 13,为什么?

解决方法

首先,month 是一个数组 - 不是切片 - 其类型为 [13]string。只需查看其类型,我们就知道它有 13 个元素(长度),而切片的类型为 []string

Problemumgehung

0 处为数组指定 stringZuallererst ist Monat ein Array – kein Slice – und sein Typ ist [13]string. Wenn wir uns nur seinen Typ ansehen, wissen wir, dass er 13 Elemente (Länge) hat und der Typ des Slice []string ist.

Array- und Slice-Indizierung beginnt bei Null, nicht bei Eins. Da Sie den

-Wert nicht indizieren:

month := [...]string{1: "jan", 2: "fab", 3: "march", 4: "april", 5: "may", 6: "june", 7: "july", 8: "aug", 9: "sep", 10: "oct", 11: "nov", 12: "dec"}
stringEs ist äquivalent zu:
month := [13]string{0: "", 1: "jan", 2: "fab", 3: "march", 4: "april", 5: "may", 6: "june", 7: "july", 8: "aug", 9: "sep", 10: "oct", 11: "nov", 12: "dec"}
Das heißt, der

Nullwert

(also der leere String) von ... 替换为 13 wird als erstes Element bereitgestellt.

Bitte beachten Sie, dass ich

habe. Die Auslassungspunkte weisen den Compiler an, die Länge des Arrays (das Teil seines Typs ist) basierend auf dem Initialisierer abzuleiten.

month 的长度仍将为 13 Auch wenn Sie als Initialisierer ein Slice-Literal anstelle eines Array-Literals verwenden:

month := []string{1: "Jan", 2: "Fab", 3: "March", 4: "April", 5: "May", 6: "June", 7: "July", 8: "Aug", 9: "Sep", 10: "Oct", 11: "Nov", 12: "Dec"}
🎜Aus den gleichen Gründen wie oben (in diesem Fall Schneiden) 🎜. 🎜

Das obige ist der detaillierte Inhalt vonSlice gibt eine unerwartete Länge zurück. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen