Pituus vs Kapasiteetti
Taulukon tai viipaleen pituus voidaan selvittää len-funktiolla:
index.go
12345randomNumbers := [] int { 1, 4, 5, 7, 9, 10, 12 } fmt.Println(len(randomNumbers)) // Output: 7 numbersSlice := randomNumbers[2:7] fmt.Println(len(numbersSlice)) // Output: 5
Taulukon tai viipaleen kapasiteetti voidaan selvittää cap-funktion avulla:
randomNumbers := [] int { 1, 4, 5, 7, 9, 10, 12 }
fmt.Println(cap(randomNumbers)) // Output: 7
numbersSlice := randomNumbers[2:7]
fmt.Println(cap(numbersSlice)) // Output: 5
Taulukon pituus ja kapasiteetti ovat aina samat. Viipaleen kohdalla kapasiteetti voi kuitenkin poiketa pituudesta. Esimerkiksi, kun viipale luodaan taulukosta, kapasiteetti on suurempi kuin pituus:
index.go
1234randomNumbers := [7] int { 1, 4, 5, 7, 9, 10, 12 } numbersSlice := randomNumbers[1:3] fmt.Println(len(numbersSlice)) // Output: 2 fmt.Println(cap(numbersSlice)) // Output: 6
Viipaleen kapasiteetti tarkoittaa niiden alkioiden määrää, jotka ulottuvat viipaleen startingIndex-indeksistä alkuperäisen taulukon loppuun, josta viipale on luotu. Yllä olevassa esimerkissä kapasiteetti on 6.
Muista, että viipaleen muokkaaminen muuttaa myös alkuperäistä taulukkoa. Tässä esimerkissä alkion (tai arvon) lisääminen viipaleeseen päivittää käytännössä alkuperäisen taulukon viipaleen loppuindeksin viereisen alkion. Toisin sanoen, viipaleen koko kasvaa ja alkuperäisen taulukon alkiot päivittyvät lisättyjen arvojen mukaisesti. Tämä selkeytyy seuraavan esimerkin avulla:
index.go
12345randomNumbers := [7] int { 1, 4, 5, 7, 9, 10, 12 } numbersSlice := randomNumbers[1:3] fmt.Println(randomNumbers) // Output: [1 4 5 7 9 10 12] numbersSlice = append(numbersSlice, 20, 30, 40) fmt.Println(randomNumbers) // Output: [1 4 5 20 30 40 12]
Kapasiteetti on hyödyllinen, kun halutaan tietää, kuinka monta alkiota viipaleeseen voidaan lisätä. Jos viipaleen kapasiteetti ylitetään, append-funktio luo ja palauttaa uuden viipaleen, joka ei enää ole yhteydessä alkuperäisen taulukon osaan. Tällöin viipale irtoaa alkuperäisestä taulukosta.
Seuraavassa esimerkissä alkuperäinen taulukko pysyy muuttumattomana, vaikka viipaleeseen lisätään enemmän alkioita:
index.go
12345678numbers := [] int { 1, 2, 3, 4 } numSlice := numbers[1:3] fmt.Println(numbers) // Outputs: [1 2 3 4] fmt.Println(numSlice) // Outputs: [2 3] fmt.Println(cap(numSlice)) // Outputs: 3 numSlice = append(numSlice, 9, 10) fmt.Println(numSlice) // Outputs: [2 3 9 10] fmt.Println(numbers) // Outputs: [1 2 3 4]
Tämä tapahtui, koska viipaleen kapasiteetti oli 3, jonka ylitimme. Tämän seurauksena append-funktio palautti uuden viipaleen, joka ei enää viittaa alkuperäiseen taulukkoon.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Can you explain more about how the `append` function works with slices?
What happens if I modify a slice after exceeding its capacity?
Can you provide an example showing the difference between modifying a slice within its capacity and after exceeding it?
Awesome!
Completion rate improved to 1.96
Pituus vs Kapasiteetti
Pyyhkäise näyttääksesi valikon
Taulukon tai viipaleen pituus voidaan selvittää len-funktiolla:
index.go
12345randomNumbers := [] int { 1, 4, 5, 7, 9, 10, 12 } fmt.Println(len(randomNumbers)) // Output: 7 numbersSlice := randomNumbers[2:7] fmt.Println(len(numbersSlice)) // Output: 5
Taulukon tai viipaleen kapasiteetti voidaan selvittää cap-funktion avulla:
randomNumbers := [] int { 1, 4, 5, 7, 9, 10, 12 }
fmt.Println(cap(randomNumbers)) // Output: 7
numbersSlice := randomNumbers[2:7]
fmt.Println(cap(numbersSlice)) // Output: 5
Taulukon pituus ja kapasiteetti ovat aina samat. Viipaleen kohdalla kapasiteetti voi kuitenkin poiketa pituudesta. Esimerkiksi, kun viipale luodaan taulukosta, kapasiteetti on suurempi kuin pituus:
index.go
1234randomNumbers := [7] int { 1, 4, 5, 7, 9, 10, 12 } numbersSlice := randomNumbers[1:3] fmt.Println(len(numbersSlice)) // Output: 2 fmt.Println(cap(numbersSlice)) // Output: 6
Viipaleen kapasiteetti tarkoittaa niiden alkioiden määrää, jotka ulottuvat viipaleen startingIndex-indeksistä alkuperäisen taulukon loppuun, josta viipale on luotu. Yllä olevassa esimerkissä kapasiteetti on 6.
Muista, että viipaleen muokkaaminen muuttaa myös alkuperäistä taulukkoa. Tässä esimerkissä alkion (tai arvon) lisääminen viipaleeseen päivittää käytännössä alkuperäisen taulukon viipaleen loppuindeksin viereisen alkion. Toisin sanoen, viipaleen koko kasvaa ja alkuperäisen taulukon alkiot päivittyvät lisättyjen arvojen mukaisesti. Tämä selkeytyy seuraavan esimerkin avulla:
index.go
12345randomNumbers := [7] int { 1, 4, 5, 7, 9, 10, 12 } numbersSlice := randomNumbers[1:3] fmt.Println(randomNumbers) // Output: [1 4 5 7 9 10 12] numbersSlice = append(numbersSlice, 20, 30, 40) fmt.Println(randomNumbers) // Output: [1 4 5 20 30 40 12]
Kapasiteetti on hyödyllinen, kun halutaan tietää, kuinka monta alkiota viipaleeseen voidaan lisätä. Jos viipaleen kapasiteetti ylitetään, append-funktio luo ja palauttaa uuden viipaleen, joka ei enää ole yhteydessä alkuperäisen taulukon osaan. Tällöin viipale irtoaa alkuperäisestä taulukosta.
Seuraavassa esimerkissä alkuperäinen taulukko pysyy muuttumattomana, vaikka viipaleeseen lisätään enemmän alkioita:
index.go
12345678numbers := [] int { 1, 2, 3, 4 } numSlice := numbers[1:3] fmt.Println(numbers) // Outputs: [1 2 3 4] fmt.Println(numSlice) // Outputs: [2 3] fmt.Println(cap(numSlice)) // Outputs: 3 numSlice = append(numSlice, 9, 10) fmt.Println(numSlice) // Outputs: [2 3 9 10] fmt.Println(numbers) // Outputs: [1 2 3 4]
Tämä tapahtui, koska viipaleen kapasiteetti oli 3, jonka ylitimme. Tämän seurauksena append-funktio palautti uuden viipaleen, joka ei enää viittaa alkuperäiseen taulukkoon.
Kiitos palautteestasi!