Teknologian jakaminen

[Go series] -taulukko, leikkaa ja kartta

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Yhdistä edellinen ja seuraava

Esittelimme edellisessä artikkelissamme, että tätä ei pitäisi harjoitella.continue Lauseke parillisten lukujen summan laskemiseksi 100:n sisällä. Kun kirjoitamme koodia,continuelauseke auttaa meitä ohittamaan tietyt iteraatiot, joita ei tarvita, esimerkiksi tässä esimerkissä ohitamme kaikki parittomat luvut.

  1. sum := 0
  2. for i := 1; i < 100; i++{
  3. if i & 1 == 0 {
  4. continue
  5. }
  6. sum += i
  7. }
  8. fmt.Println("the sum is",sum)

Aloita oppiminen

Ohjelmoinnissa joudumme usein käsittelemään samantyyppisiä elementtejä, ja näitä elementtijoukkoja edustavat tietyt tietorakenteet Go-kielessä. Tänään esittelen sinulle useita kokoelmatyyppejä Gossa yksityiskohtaisesti: array, slice ja map.

joukko

Aloitetaan ensin taulukoista. Taulukko on Go:n perustietorakenne. Se on samantyyppisten elementtien kiinteäpituinen sarja. Kun taulukko on ilmoitettu, sen pituutta ei voi muuttaa. Taulukon ilmoittaminen ja alustus ovat hyvin yksinkertaisia,

Ilmoita array

Kun määrität taulukon, sinun on määritettävä taulukon tyyppi ja pituus. Näin taulukko ilmoitetaan:

var arrayName [arrayLength]elementType

Ilmoita esimerkiksi kokonaislukutaulukko, jonka pituus on 5:

var numbers [5]int
alusta array

Voit alustaa taulukon useilla tavoilla:

  • Käytä kirjaimellista alustusta:
var numbers = [5]int{1, 2, 3, 4, 5}
  • käyttää:=Lyhyt lausunto:
numbers := [5]int{1, 2, 3, 4, 5}
  • Päättele taulukon pituus automaattisesti:
numbers := [...]int{1, 2, 3, 4, 5}
  • Määritä indeksin alustus:
numbers := [5]int{0: 1, 4: 5}

Taulukon ominaisuudet

  • Kiinteä pituus: Taulukon pituus määritetään, kun se ilmoitetaan, eikä sitä voi muuttaa myöhemmin.
  • samantyyppisiä elementtejä: Taulukot voivat sisältää vain samantyyppisiä elementtejä.
  • muistin varaus peräkkäin: Matriisielementit on allokoitu vierekkäin muistissa, mikä tekee taulukon elementtien käyttämisestä erittäin tehokasta.

Käytä taulukon elementtejä

Voit käyttää taulukon elementtejä indeksin perusteella, alkaen 0:sta:

value := numbers[2] // 获取索引为 2 的元素

Traverse array

voit käyttääforSelaa kaikkia taulukon elementtejä:

  1. for i, value := range numbers {
  2. fmt.Printf("Index: %d, Value: %dn", i, value)
  3. }

taulukon pituus

Voit käyttää sisäänrakennettualenFunktio taulukon pituuden saamiseksi:

length := len(numbers)

taulukon arvo nolla

Jos taulukkoa ei ole nimenomaisesti alustettu, sen elementit asetetaan automaattisesti tyypin nolla-arvoon. Esimerkiksi kokonaislukutaulukon nolla-arvo on 0:

var numbers [5]int // 所有元素都是 0

Moniulotteiset taulukot

Go-kieli tukee myös moniulotteisia taulukoita. Seuraavassa on esimerkki 2x3 kokonaislukutaulukon ilmoittamisesta ja alustamisesta:

  1. var matrix [2][3]int
  2. matrix = [2][3]int{{1, 2, 3}, {4, 5, 6}}

Arrays rajoitukset

Koska taulukon pituus on kiinteä, tämä ei välttämättä ole kovin joustava joissakin tapauksissa. Jos tarvitset vaihtelevan pituuden kokoelman, voit käyttää viipaleita.

viipale

Seuraava on slice, joka on joustavampi sisäänrakennettu tyyppi, jota voidaan pitää dynaamisena taulukona. Viipaleen pituus on vaihteleva ja se luodaan taulukon perusteella, mikä lisää mukavuutta. Voit ilmoittaa ja alustaa viipaleen seuraavasti:

  1. s := make([]int, 3) // 创建一个长度为3的整型切片
  2. s[0] = 1 // 切片元素赋值
  3. s[1] = 2
  4. s[2] = 3
  5. s = append(s, 4) // 向切片追加元素

Go-kielessä, vaikka taulukoita ja viipaleita käytetään molempien samantyyppisten elementtien sarjan tallentamiseen, niillä on merkittäviä eroja muistin varaamisessa, koon vaihtelussa ja käytössä. Tässä ovat tärkeimmät erot taulukoiden ja viipaleiden välillä:

koon vaihtelu

  • joukko : Taulukon koko määritetään, kun se ilmoitetaan, eikä sitä voi muuttaa myöhemmin.Matriisin koko on osa sen tyyppiä, joten[3]intja[4]intovat eri tyyppejä.
  • viipale : Leikkeet ovat dynaamisia ja voivat kasvaa tai kutistua suorituksen aikana.Viipaleen koko ei ole osa sen tyyppiä, joten[]intOn yleinen tyyppi kaikille kokonaislukuviipaleille.

muistin varaus

  • joukko : Taulukot ovat arvotyyppejä, ja kun taulukko välitetään funktioparametrina, välitetään kopio sen arvosta. Tämä tarkoittaa, että muutokset funktion sisällä olevaan taulukkoon eivät vaikuta alkuperäiseen taulukkoon.
  • viipale : Slice on viitetyyppi, joka sisältää osoittimen alla olevaan taulukkoon, viipaleen pituuteen ja kapasiteettiin. Kun viipale välitetään funktioparametrina, osoittimen kopio välitetään, joten funktion sisällä tehtävät muutokset vaikuttavat alkuperäiseen osaan.

alustus

  • joukko: Taulukkoa alustettaessa sen koko on määritettävä ja elementtiarvot voidaan määrittää välittömästi.
  • viipale: Viipaletta voidaan siirtää literaalien läpi,makeAlustettava funktio tai lohko taulukosta, kokoa ei ole määritetty.

Esimerkkikoodi

Tässä on esimerkkejä taulukoiden ja osien alustamisesta:

  1. // 数组
  2. var arr [3]int = [3]int{1, 2, 3}
  3. // 切片
  4. var slice []int = []int{1, 2, 3}
  5. // 或者使用 make 函数
  6. slice := make([]int, 3)

Toiminnalliset erot

  • joukko: Koska koko on kiinteä, taulukon koko tiedetään käännöshetkellä, mikä mahdollistaa muistin varaamisen pinossa olevalle taulukolle, ja taulukon elementtien ajallinen monimutkaisuus on O(1).
  • viipale: Viipalointi tarjoaa enemmän joustavuuttaappend Funktio lisää elementtejä tai hankkii osaviipaleita leikkaustoimintojen avulla.Viipaleen alla oleva matriisi voidaan varata kasaan, ja viipaleen elementteihin pääsyn aika monimutkaisuus on myös O(1), muttaappendSaattaa johtaa taustalla olevan taulukon uudelleenallokointiin, mikä on tyypillisesti O(n)-operaatio.

kartoitus

Lopuksi katsotaan kartoitus. Kartta on Go:ssa assosiatiivinen taulukko, joka kartoittaa avaimet arvoihin. Kartan avaimet voivat olla mitä tahansa yhtäläisyysoperaattorin tukemaa tyyppiä, kuten kokonaislukuja, liukulukuja, merkkijonoja, osoittimia, rajapintoja (kunhan rajapinnan sisältämät arvot ovat vertailukelpoisia), rakenteita ja taulukoita. Kartoitettu arvo voi olla mitä tahansa tyyppiä.

Ilmoitus ja alustus

julistaa karttaa

Kartan ilmoittamisen syntaksi on seuraava:

var mapName map[keyType]valueType

Määritä esimerkiksi kartta, jossa avaimet ovat merkkijonoja ja arvot kokonaislukuina:

var scores map[string]int
Alusta kartta

Kartan ilmoittamisen jälkeen sinun on läpäistävämaketoiminto alustaaksesi sen, jotta sitä voidaan käyttää:

scores = make(map[string]int)

Vaihtoehtoisesti voit käyttää lyhyttä ilmoitusta ja alustaa:

scores := make(map[string]int)

Voit myös käyttää literaaleja alustukseen ilmoitushetkellä:

  1. scores := map[string]int{
  2. "alice": 90,
  3. "bob": 85,
  4. "charlie": 88,
  5. }

Kartan ominaisuudet

  • keskeinen ainutlaatuisuus: Kartassa jokainen avain on yksilöllinen. Jos yrität lisätä olemassa olevan avaimen, se päivittää avainta vastaavan arvon.
  • häiriö:map on järjestämätön, ja elementtien järjestys voi olla erilainen joka kerta, kun karttaa iteroidaan.
  • dynaaminen koko:Kartan koko on dynaaminen, voit lisätä tai poistaa avainarvopareja tarpeen mukaan.
  • viitetyyppi: Kartta on viitetyyppi Kun siirrät kartan funktioon, se mitä välität, on osoitin alla olevaan tietorakenteeseen.

Toiminta kartta

Lisää elementti
scores["alice"] = 90
Hanki elementti
value := scores["alice"]

Jos avainta ei ole olemassa, tälle arvotyypille palautetaan nolla-arvo.

Tarkista, onko avain olemassa

Voit käyttää pilkkua -ok idiomia tarkistaaksesi, onko avain olemassa kartassa:

  1. value, exists := scores["alice"]
  2. if exists {
  3. // 键存在
  4. } else {
  5. // 键不存在
  6. }
Poista elementti

käyttäädeleteFunktio voi poistaa avain-arvo-parin kartalta:

delete(scores, "alice")

Jos avainta ei ole,deleteToiminto ei tee mitään.

Kulje kartta

käyttääforSilmukka voi kulkea kaikkien kartan avainarvoparien läpi:

  1. for key, value := range scores {
  2. fmt.Printf("%s: %dn", key, value)
  3. }

kartan arvo nolla

Kartan nolla-arvo onnil .yksinil Kartalla ei ole taustalla olevaa tietorakennetta, eikä siihen voi lisätä elementtejä.Ennen kuin lisäät elementtejä karttaan, sinun on käytettävämakeAlusta se.

kartan pituus

Voit käyttää sisäänrakennettualenToiminto avainarvo-parien määrän saamiseksi kartalle:

length := len(scores)

karttaavaintyyppi

Kartan avaimet voivat olla mitä tahansa vertailukelpoisia tyyppejä, kuten kokonaislukuja, liukulukuja, merkkijonoja, osoittimia, rajapintoja (kunhan käyttöliittymän sisältämät arvot ovat vertailukelpoisia), rakenteita, taulukoita jne. Viipaleita, karttoja ja toimintoja ei voi käyttää karttaavaimina, koska nämä tyypit eivät tue tasa-arvovertailuja.

Helppo tehdä virheitä

Go-kielessä taulukot, viipaleet ja kartat ovat kolme yleisesti käytettyä tietorakennetta, joilla jokaisella on erilaiset ominaisuudet ja näkökohdat. Tässä on muutamia huomioitavia kohtia niitä käytettäessä:

Array

  • Vältä käyttämästä liian suuria taulukoita, koska ne vievät paljon pinotilaa ja voivat aiheuttaa pinon ylivuotoa.
  • Tauluja käytetään, kun vaaditaan kiinteän kokoinen tietokokoelma.

Viipale

  • Muistin uudelleenallokointia voi tapahtua, kun viipalointia laajennetaan. Yritä varata riittävästi kapasiteettia välttääksesi toistuvan laajennuksen.
  • Vältä käyttämästä liian suuria viipaleita, koska ne voivat viedä paljon kasatilaa.
  • Huomaa, että viipaleen nolla-arvo onnil, on alustettava ennen käyttöä.

kartta

  • Kartan nolla-arvo onnilnilKarttaa ei voi käyttää avain-arvo-parien tallentamiseen, ja se on alustettava ennen käyttöä.
  • Samanaikaisessa ympäristössä luku- ja kirjoitustoiminnot kartalle eivät ole säikeen turvallisia, ja ne on suojattava käyttämällä mutex-lukkoja tai muita synkronointimekanismeja.
  • käyttäädeleteOlemattoman avaimen poistaminen ei aiheuta virhettä, mutta avaimen olemassaolo on turvallista tarkistaa.