Golang-opetusohjelma: Opi Go-ohjelmointikieli aloittelijoille
Mikä on Go?
Go (tunnetaan myös nimellä Golang) on Googlen kehittämä avoimen lähdekoodin ohjelmointikieli. Se on staattisesti kirjoitettu käännetty kieli. Go tukee samanaikaista ohjelmointia, eli mahdollistaa useiden prosessien ajamisen samanaikaisesti. Tämä saavutetaan käyttämällä kanavia, gorutiineja jne. Go Languagessa on roskakeräys, joka itse hoitaa muistinhallinnan ja mahdollistaa toimintojen viivästyneen suorittamisen.
Opimme kaikki Golangin perusteet tässä Learn Go Language -opetusohjelmassa.
Kuinka ladata ja asentaa GO
Vaihe 1) Mene https://golang.org/dl/. Lataa binaari käyttöjärjestelmällesi.
Vaihe 2) Double napsauta asennusohjelmaa ja napsauta Suorita.
Vaihe 3) Napsauta Seuraava
Vaihe 4) Valitse asennuskansio ja napsauta Seuraava.
Vaihe 5) Napsauta Valmis, kun asennus on valmis.
Vaihe 6) Kun asennus on valmis, voit tarkistaa sen avaamalla päätelaitteen ja kirjoittamalla
go version
Tämä näyttää go asennetun version
Ensimmäinen Go -ohjelmasi – Go Hello World!
Luo kansio nimeltä studyGo. Tässä Go-kielen opetusohjelmassa luomme go-ohjelmamme tähän kansioon. Go-tiedostot luodaan laajennuksella .mennä. Voit ajaa Go-ohjelmia syntaksin avulla
go run <filename>
Luo tiedosto nimeltä first.go ja lisää siihen alla oleva koodi ja tallenna
package main import ("fmt") func main() { fmt.Println("Hello World! This is my first Go program\n") }
Siirry tähän kansioon terminaalissasi. Suorita ohjelma komennolla
juokse ensin. Mene
Voit nähdä tulosteen tulostuksen
Hello World! This is my first Go program
Keskustellaan nyt yllä olevasta ohjelmasta.
paketin pää – Jokaisen Go Language -ohjelman tulee alkaa paketin nimellä. Go antaa meille mahdollisuuden käyttää paketteja toisissa go -ohjelmissa ja tukee siten koodin uudelleenkäytettävyyttä. Go-ohjelman suorittaminen alkaa koodilla paketin sisällä nimeltä main.
import fmt – tuo paketin fmt. Tämä paketti toteuttaa I/O-toiminnot.
func main() – Tämä on funktio, josta ohjelman suoritus alkaa. Päätoiminto tulee aina sijoittaa pääpakkaukseen. Main():n alle voit kirjoittaa koodin { } -kohtaan.
fmt.Println – Tämä tulostaa tekstin näytölle fmt:n Println-toiminnolla.
Huomautus: Kun mainitset tämän Go-opetusohjelman alla olevissa osissa suorita/suorita koodi, se tarkoittaa koodin tallentamista tiedostoon, jonka tunniste on .go ja sen suorittamista käyttämällä syntaksia.
go run <filename>
Tietotyypit
Tyypit (tietotyypit) edustavat muuttujaan tallennetun arvon tyyppiä, funktion palauttaman arvon tyyppiä jne.
Go Languagessa on kolme perustyyppiä
Numeeriset tyypit – Edustavat numeerisia arvoja, jotka sisältävät kokonaisluvun, liukuluku- ja kompleksiarvot. Erilaisia numeerisia tyyppejä ovat:
int8 – 8 bitin etumerkilliset kokonaisluvut.
int16 – 16 bitin etumerkilliset kokonaisluvut.
int32 – 32 bitin etumerkilliset kokonaisluvut.
int64 – 64 bitin etumerkilliset kokonaisluvut.
uint8 – 8-bittiset etumerkittömät kokonaisluvut.
uint16 – 16-bittiset etumerkittömät kokonaisluvut.
uint32 – 32-bittiset etumerkittömät kokonaisluvut.
uint64 – 64-bittiset etumerkittömät kokonaisluvut.
float32 – 32-bittiset liukulukuluvut.
float64 – 64-bittiset liukulukuluvut.
complex64 – sisältää float32 todellisia ja kuvitteellisia osia.
complex128 – sisältää float32 todellisia ja kuvitteellisia osia.
Merkkijonotyypit – Edustaa tavujen (merkkien) sarjaa. Voit tehdä merkkijonoille erilaisia toimintoja, kuten merkkijonojen yhdistämisen, alimerkkijonon purkamisen jne
Boolen tyypit – Edustaa kahta arvoa, joko tosi tai epätosi.
Golangin käyttöliittymä
Golangin käyttöliittymä on kokoelma menetelmäallekirjoituksia, joita tyyppi käyttää objektien käyttäytymisen toteuttamiseen. Golang-käyttöliittymän päätavoite on tarjota menetelmäallekirjoituksia nimillä, argumenteilla ja palautustyypeillä. Tyyppi on itse määriteltävä ja toteuttava menetelmä. Golangin käyttöliittymä voidaan ilmoittaa avainsanalla "liitäntä".
Muuttujat
Muuttujat osoittavat muistipaikkaa, joka tallentaa jonkinlaisen arvon. Tyyppiparametri (alla olevassa syntaksissa) edustaa arvon tyyppiä, joka voidaan tallentaa muistipaikkaan.
Muuttuja voidaan ilmoittaa syntaksin avulla
var <variable_name> <type>
Kun olet ilmoittanut tyypin muuttujan, voit määrittää muuttujan mille tahansa kyseisen tyypin arvolle.
Voit myös antaa muuttujalle alkuarvon itse ilmoituksen aikana
var <variable_name> <type> = <value>
Jos määrität muuttujan alkuarvolla, päättele muuttujan tyyppi määritetyn arvon perusteella. Joten voit jättää tyypin pois ilmoituksen aikana syntaksin avulla
var <variable_name> = <value>
Voit myös ilmoittaa useita muuttujia syntaksilla
var <variable_name1>, <variable_name2> = <value1>, <value2>
Tämän Go-opetusohjelman alla olevassa ohjelmassa on joitain Golang-esimerkkejä muuttujamäärityksistä
package main import "fmt" func main() { //declaring a integer variable x var x int x=3 //assigning x the value 3 fmt.Println("x:", x) //prints 3 //declaring a integer variable y with value 20 in a single statement and prints it var y int=20 fmt.Println("y:", y) //declaring a variable z with value 50 and prints it //Here type int is not explicitly mentioned var z=50 fmt.Println("z:", z) //Multiple variables are assigned in single line- i with an integer and j with a string var i, j = 100,"hello" fmt.Println("i and j:", i,j) }
Tulos tulee olemaan
x: 3 y: 20 z: 50 i and j: 100 hello
Go Language tarjoaa myös helpon tavan ilmoittaa muuttujat arvolla jättämällä pois avainsanan var using
<variable_name> := <value>
Huomaa, että käytit := sijasta =. Et voi käyttää :=:ää vain arvon määrittämiseen jo määritetylle muuttujalle. := käytetään arvon ilmoittamiseen ja määrittämiseen.
Luo tiedosto nimeltä assign.go seuraavalla koodilla
package main import ("fmt") func main() { a := 20 fmt.Println(a) //gives error since a is already declared a := 30 fmt.Println(a) }
Suorita mene ja suorita assign.go nähdäksesi tuloksen muodossa
./assign.go:7:4: no new variables on left side of :=
Ilman alkuarvoa ilmoitetuilla muuttujilla on 0 numeerisille tyypeille, false Boolen ja tyhjä merkkijono merkkijonoille
vakiot
Vakiomuuttujat ovat muuttujia, joiden arvoa ei voi muuttaa kerran määritettynä. Go-ohjelmointikielen vakio ilmoitetaan käyttämällä avainsanaa "const"
Luo tiedosto nimeltä állandó.go ja seuraava koodi
package main import ("fmt") func main() { const b =10 fmt.Println(b) b = 30 fmt.Println(b) }
Suorita mene ajaa konstantti.go nähdäksesi tuloksen muodossa
.constant.go:7:4: cannot assign to b
Silmukkaesimerkkejä varten
Silmukoita käytetään lausekkeiden lohkon suorittamiseen toistuvasti ehdon perusteella. Useimmat ohjelmointikielet tarjoavat 3 tyyppisiä silmukoita – for, while, do while. Mutta Go-ohjelmointikieli tukee vain silmukkaa.
Golang for -silmukan syntaksi on
for initialisation_expression; evaluation_expression; iteration_expression{ // one or more statement }
Alustuslauseke suoritetaan ensin (ja vain kerran) Golang for -silmukassa.
Sitten arviointi_lauseke arvioidaan ja jos se on totta, lohkon sisällä oleva koodi suoritetaan.
Iteration_expression id suoritetaan ja arviointi_lauseke arvioidaan uudelleen. Jos se on totta, lausekelohko suoritetaan uudelleen. Tämä jatkuu, kunnes arviointi_lauseke muuttuu epätosi.
Kopioi alla oleva ohjelma tiedostoon ja suorita se nähdäksesi Golang for loop -tulostusnumerot 1-5
package main import "fmt" func main() { var i int for i = 1; i <= 5; i++ { fmt.Println(i) } }
Lähtö on
1 2 3 4 5
Tai muuten
Jos muuten on ehdollinen lausunto. Synaksi on
if condition{ // statements_1 }else{ // statements_2 }
Tässä ehto arvioidaan ja jos se on tosi, lausekkeet_1 suoritetaan muuten lausekkeet_2 suoritetaan.
Voit käyttää if-lausetta myös ilman muuta. Voit myös olla ketjutettuja jos else -lauseita. Alla olevat ohjelmat selittävät enemmän, jos muuta.
Suorita alla oleva ohjelma. Se tarkistaa, onko luku x pienempi kuin 10. Jos on, se tulostaa "x on pienempi kuin 10".
package main import "fmt" func main() { var x = 50 if x < 10 { //Executes if x < 10 fmt.Println("x is less than 10") } }
Koska x:n arvo on suurempi kuin 10, tässä if block -ehtoa ei suoriteta.
Katso nyt alla oleva ohjelma. Tässä Go-ohjelmointikielen opetusohjelmassa meillä on else-lohko, joka suoritetaan jos-arvioinnin epäonnistuessa.
package main import "fmt" func main() { var x = 50 if x < 10 { //Executes if x is less than 10 fmt.Println("x is less than 10") } else { //Executes if x >= 10 fmt.Println("x is greater than or equals 10") } }
Tämä ohjelma antaa sinulle tulosteen
x is greater than or equals 10
Nyt tässä Go-opetusohjelmassa näemme ohjelman, jossa on useita if else -lohkoja (ketjutettu jos else). Suorita alla oleva Go-esimerkki. Se tarkistaa, onko luku pienempi kuin 10 tai välillä 10-90 vai suurempi kuin 90.
package main import "fmt" func main() { var x = 100 if x < 10 { //Executes if x is less than 10 fmt.Println("x is less than 10") } else if x >= 10 && x <= 90 { //Executes if x >= 10 and x<=90 fmt.Println("x is between 10 and 90") } else { //Executes if both above cases fail i.e x>90 fmt.Println("x is greater than 90") } }
Tässä ensin if-ehto tarkistaa, onko x pienempi kuin 10 ja se ei ole. Joten se tarkistaa seuraavan ehdon (muuten jos), onko se 10 ja 90 välillä, mikä on myös epätosi. Joten se sitten suorittaa lohkon else-osion alla, joka antaa tulosteen
x is greater than 90
Vaihtaa
Switch on toinen ehdollinen lause. Switch-käskyt arvioivat lausekkeen ja tulosta verrataan käytettävissä oleviin arvoihin (tapauksiin). Kun vastaavuus on löydetty, kyseiseen osumaan (tapaukseen) liittyvät lausunnot suoritetaan. Jos vastaavuutta ei löydy, mitään ei suoriteta. Voit myös lisätä oletustapauksen vaihtaaksesi, joka suoritetaan, jos muita osumia ei löydy. Kytkimen syntaksi on
switch expression { case value_1: statements_1 case value_2: statements_2 case value_n: statements_n default: statements_default }
Tässä lausekkeen arvoa verrataan kunkin tapauksen arvoihin. Kun vastaavuus on löydetty, kyseiseen tapaukseen liittyvät lausunnot suoritetaan. Jos vastaavuutta ei löydy, oletusosion alaiset käskyt suoritetaan.
Suorita alla oleva ohjelma
package main import "fmt" func main() { a,b := 2,1 switch a+b { case 1: fmt.Println("Sum is 1") case 2: fmt.Println("Sum is 2") case 3: fmt.Println("Sum is 3") default: fmt.Println("Printing default") } }
Saat tulosteen muodossa
Sum is 3
Muuta a:n ja b:n arvot 3:ksi ja tulos on
Printing default
Tapauksessa voi olla myös useita arvoja erottamalla ne pilkulla.
taulukot
Taulukko edustaa kiinteän kokoista, nimettyä sarjaa samantyyppisiä elementtejä. Sinulla ei voi olla taulukkoa, joka sisältää sekä kokonaislukua että merkkejä. Et voi muuttaa taulukon kokoa, kun olet määrittänyt koon.
Taulukon ilmoittamisen syntaksi on
var arrayname [size] type
Jokaiselle taulukon elementille voidaan antaa arvo syntaksin avulla
arrayname [index] = value
Array-indeksi alkaa 0 kokoon-1.
Voit määrittää taulukon elementeille arvoja määrityksen aikana syntaksin avulla
arrayname := [size] type {value_0,value_1,…,value_size-1}
Voit myös jättää koko-parametrin huomioimatta, kun määrität taulukon arvoilla korvaamalla koon arvolla ... ja kääntäjä löytää pituuden arvojen lukumäärästä. Syntaksi on
arrayname := […] type {value_0,value_1,…,value_size-1}
Voit selvittää taulukon pituuden käyttämällä syntaksia
len(arrayname)
Suorita alla oleva Go-esimerkki ymmärtääksesi taulukon
package main import "fmt" func main() { var numbers [3] string //Declaring a string array of size 3 and adding elements numbers[0] = "One" numbers[1] = "Two" numbers[2] = "Three" fmt.Println(numbers[1]) //prints Two fmt.Println(len(numbers)) //prints 3 fmt.Println(numbers) // prints [One Two Three] directions := [...] int {1,2,3,4,5} // creating an integer array and the size of the array is defined by the number of elements fmt.Println(directions) //prints [1 2 3 4 5] fmt.Println(len(directions)) //prints 5 //Executing the below commented statement prints invalid array index 5 (out of bounds for 5-element array) //fmt.Println(directions[5]) }
ulostulo
Two 3 [One Two Three] [1 2 3 4 5] 5
Golang Slice and Append Function
Viipale on taulukon osa tai segmentti. Tai se on näkymä tai osittainen näkymä taustalla olevasta taulukosta, johon se osoittaa. Voit käyttää viipaleen elementtejä käyttämällä viipaleen nimeä ja indeksinumeroa aivan kuten taulukossa. Et voi muuttaa taulukon pituutta, mutta voit muuttaa viipaleen kokoa.
Viipaleen sisältö on itse asiassa osoittimia taulukon elementteihin. Se tarkoittaa jos muutat mitä tahansa osion elementtiä, se vaikuttaa myös alla olevan taulukon sisältöön.
Viipaleen luomisen syntaksi on
var slice_name [] type = array_name[start:end]
Tämä luo lohkon nimeltä viipaleen_nimi taulukosta, jonka nimi on taulukon_nimi, ja indeksin elementit ovat alusta loppuun-1.
Nyt tässä Golang-opetusohjelmassa suoritamme alla olevan ohjelman. Ohjelma luo lohkon taulukosta ja tulostaa sen. Voit myös nähdä, että osion sisällön muokkaaminen muuttaa todellista taulukkoa.
package main import "fmt" func main() { // declaring array a := [5] string {"one", "two", "three", "four", "five"} fmt.Println("Array after creation:",a) var b [] string = a[1:4] //created a slice named b fmt.Println("Slice after creation:",b) b[0]="changed" // changed the slice data fmt.Println("Slice after modifying:",b) fmt.Println("Array after slice modification:",a) }
Tämä tulostaa tuloksen muodossa
Array after creation: [one two three four five] Slice after creation: [two three four] Slice after modifying: [changed three four] Array after slice modification: [one changed three four five]
On olemassa tiettyjä toimintoja, kuten Golang len, Golang append, joita voit käyttää viipaleille
len(slice_name) – palauttaa viipaleen pituuden
liittää(viipaleen_nimi, arvo_1, arvo_2) – Golang append käytetään arvon_1 ja arvon_2 lisäämiseen olemassa olevaan osaan.
append(slice_nale1,slice_name2…) – liittää viipaleen_nimi2 lohkon_nimi1:een
Suorita seuraava ohjelma.
package main import "fmt" func main() { a := [5] string {"1","2","3","4","5"} slice_a := a[1:3] b := [5] string {"one","two","three","four","five"} slice_b := b[1:3] fmt.Println("Slice_a:", slice_a) fmt.Println("Slice_b:", slice_b) fmt.Println("Length of slice_a:", len(slice_a)) fmt.Println("Length of slice_b:", len(slice_b)) slice_a = append(slice_a,slice_b...) // appending slice fmt.Println("New Slice_a after appending slice_b :", slice_a) slice_a = append(slice_a,"text1") // appending value fmt.Println("New Slice_a after appending text1 :", slice_a) }
Tulos tulee olemaan
Slice_a: [2 3] Slice_b: [two three] Length of slice_a: 2 Length of slice_b: 2 New Slice_a after appending slice_b : [2 3 two three] New Slice_a after appending text1 : [2 3 two three text1]
Ohjelma luo ensin 2 viipaletta ja tulostaa sen pituuden. Sitten se lisäsi yhden viipaleen toiseen ja sitten lisäsi merkkijonon tuloksena olevaan viipaleeseen.
Tehtävät
Funktio edustaa lausekkeiden lohkoa, joka suorittaa tietyn tehtävän. Funktiomääritys kertoo meille funktion nimen, palautustyypin ja syöttöparametrit. Funktiomäärittely edustaa funktion sisältämää koodia. Funktion ilmoittamisen syntaksi on
func function_name(parameter_1 type, parameter_n type) return_type { //statements }
Parametrit ja palautustyypit ovat valinnaisia. Voit myös palauttaa useita arvoja funktiosta.
Tässä Golang-opetusohjelmassa suoritetaan seuraava Golang-esimerkki. Tässä funktio nimeltä calc hyväksyy 2 numeroa ja suorittaa yhteen- ja vähennyslaskun ja palauttaa molemmat arvot.
package main import "fmt" //calc is the function name which accepts two integers num1 and num2 //(int, int) says that the function returns two values, both of integer type. func calc(num1 int, num2 int)(int, int) { sum := num1 + num2 diff := num1 - num2 return sum, diff } func main() { x,y := 15,10 //calls the function calc with x and y an d gets sum, diff as output sum, diff := calc(x,y) fmt.Println("Sum",sum) fmt.Println("Diff",diff) }
Tulos tulee olemaan
Sum 25 Diff 5
Jäsenyydet
Paketteja käytetään koodin järjestämiseen. Isossa projektissa ei ole mahdollista kirjoittaa koodia yhteen tiedostoon. Go-ohjelmointikielen avulla voimme järjestää koodin eri pakettien alle. Tämä lisää koodin luettavuutta ja uudelleenkäytettävyyttä. Suoritettavan Go-ohjelman tulee sisältää paketti nimeltä main ja ohjelman suoritus alkaa funktiosta, jonka nimi on main. Voit tuoda muita paketteja ohjelmaamme käyttämällä syntaksia
import package_name
Näemme ja keskustelemme tässä Golang-opetusohjelmassa pakettien luomisesta ja käyttämisestä seuraavassa Golang-esimerkissä.
Vaihe 1) Luo tiedosto nimeltä package_example.go ja lisää alla oleva koodi
package main import "fmt" //the package to be created import "calculation" func main() { x,y := 15,10 //the package will have function Do_add() sum := calculation.Do_add(x,y) fmt.Println("Sum",sum) }
Yllä olevassa ohjelmassa fmt on paketti, jonka Go-ohjelmointikieli tarjoaa meille pääasiassa I/O-tarkoituksiin. Näet myös paketin nimeltä laskenta. Main():n sisällä näet askelsumman := laskenta. Do_add(x,y). Se tarkoittaa, että kutsut funktiota Do_add paketin laskemisesta.
Vaihe 2) Ensin sinun tulee luoda pakettilaskenta samannimiseen kansioon src-kansioon go. Asennettu polku go löytyy PATH-muuttujasta.
Macissa etsi polku suorittamalla echo $PATH
Polku on siis /usr/local/go
Windowsissa etsi polku suorittamalla echo %GOROOT%
Tässä polku on C:\Go\
Vaihe 3) Siirry src-kansioon (/usr/local/go/src (mac) ja C:\Go\src (Windows). Nyt koodista paketin nimi on laskenta. Go edellyttää, että paketti on sijoitettava samannimiseen hakemistoon src-hakemiston alla. Luo src-kansioon laskenta nimeltä hakemisto.
Vaihe 4) Luo laskentahakemistoon tiedosto nimeltä calc.go (Voit antaa minkä tahansa nimen, mutta koodissa oleva paketin nimi ratkaisee. Tässä sen pitäisi olla laskenta) laskentahakemistoon ja lisää alla oleva koodi
package calculation func Do_add(num1 int, num2 int)(int) { sum := num1 + num2 return sum }
Vaihe 5) Suorita komento go install laskentahakemistosta, joka kääntää calc.go-tiedoston.
Vaihe 6) Palaa nyt osoitteeseen package_example.go ja suorita go ja suorita package_example.go. Tulos on summa 25.
Huomaa, että funktion Do_add nimi alkaa isolla kirjaimella. Tämä johtuu siitä, että Go:ssa jos funktion nimi alkaa isolla kirjaimella, se tarkoittaa, että muut ohjelmat voivat nähdä (pääsyä) siihen, muut ohjelmat eivät voi käyttää sitä. Jos funktion nimi olisi do_add, olisit saanut virheen
ei voi viitata viemättömään nimilaskentaan.calc..
Lykkää ja pinoa lykkäyksiä
Defer-lauseita käytetään lykkäämään funktiokutsun suorittamista, kunnes lykkäyskäskyn sisältävä funktio suorittaa suorituksen loppuun.
Opitaan tämä esimerkin avulla:
package main import "fmt" func sample() { fmt.Println("Inside the sample()") } func main() { //sample() will be invoked only after executing the statements of main() defer sample() fmt.Println("Inside the main()") }
Tulos tulee olemaan
Inside the main() Inside the sample()
Tässä sample():n suoritusta lykätään, kunnes sulkeva funktio (main()) on suoritettu loppuun.
Pinoamisen lykkäys käyttää useita lykkäyslausekkeita. Oletetaan, että funktion sisällä on useita lykkäyslausekkeita. Go sijoittaa kaikki lykätyt funktiokutsut pinoon, ja kun sulkeva funktio palaa, pinotut funktiot suoritetaan Last In First Out (LIFO) -tilaus. Voit nähdä tämän alla olevassa esimerkissä.
Suorita alla oleva koodi
package main import "fmt" func display(a int) { fmt.Println(a) } func main() { defer display(1) defer display(2) defer display(3) fmt.Println(4) }
Tulos tulee olemaan
4 3 2 1
Tässä suoritetaan ensin main():n sisällä oleva koodi ja sitten lykätyt funktiokutsut käänteisessä järjestyksessä eli 4, 3,2,1.
Osoittimet
Ennen kuin selitämme osoittimia, keskustellaan ensin '&'-operaattorista. &-operaattoria käytetään muuttujan osoitteen saamiseksi. Se tarkoittaa, että '&a' tulostaa muuttujan a muistiosoitteen.
Tässä Golang-opetusohjelmassa suoritamme alla olevan ohjelman näyttääksesi muuttujan arvon ja muuttujan osoitteen
package main import "fmt" func main() { a := 20 fmt.Println("Address:",&a) fmt.Println("Value:",a) }
Tuloksena on
Address: 0xc000078008 Value: 20
Osoitinmuuttuja tallentaa toisen muuttujan muistiosoitteen. Voit määrittää osoittimen syntaksin avulla
var variable_name *type
Tähti(*) tarkoittaa, että muuttuja on osoitin. Ymmärrät enemmän suorittamalla alla olevan ohjelman
package main import "fmt" func main() { //Create an integer variable a with value 20 a := 20 //Create a pointer variable b and assigned the address of a var b *int = &a //print address of a(&a) and value of a fmt.Println("Address of a:",&a) fmt.Println("Value of a:",a) //print b which contains the memory address of a i.e. &a fmt.Println("Address of pointer b:",b) //*b prints the value in memory address which b contains i.e. the value of a fmt.Println("Value of pointer b",*b) //increment the value of variable a using the variable b *b = *b+1 //prints the new value using a and *b fmt.Println("Value of pointer b",*b) fmt.Println("Value of a:",a)}
Tulos tulee olemaan
Address of a: 0x416020 Value of a: 20 Address of pointer b: 0x416020 Value of pointer b 20 Value of pointer b 21 Value of a: 21
rakenteet
Rakenne on käyttäjän määrittelemä tietotyyppi, joka itsessään sisältää yhden saman tai eri tyyppisen elementin lisää.
Rakenteen käyttäminen on 2-vaiheinen prosessi.
Ensin luo (ilmoita) rakennetyyppi
Toiseksi luo tämän tyyppiset muuttujat arvojen tallentamiseksi.
Rakenteita käytetään pääasiassa silloin, kun halutaan tallentaa toisiinsa liittyviä tietoja yhdessä.
Harkitse työntekijän tietoja, joissa on nimi, ikä ja osoite. Voit käsitellä tämän kahdella tavalla
Luo 3 taulukkoa – yksi taulukko tallentaa työntekijöiden nimet, yksi ikä ja kolmas ikä.
Ilmoita rakennetyyppi, jossa on 3 kenttää - nimi, osoite ja ikä. Luo kyseisen rakennetyypin taulukko, jossa jokainen elementti on rakenneobjekti, jolla on nimi, osoite ja ikä.
Ensimmäinen lähestymistapa ei ole tehokas. Tällaisissa skenaarioissa rakenteet ovat kätevämpiä.
Rakenteen ilmoittamisen syntaksi on
type structname struct { variable_1 variable_1_type variable_2 variable_2_type variable_n variable_n_type }
Esimerkki rakenneilmoituksesta on
type emp struct { name string address string age int }
Täällä luodaan uusi käyttäjän määrittelemä tyyppi nimeltä emp. Nyt voit luoda emp-tyypin muuttujia syntaksin avulla
var variable_name struct_name
Esimerkki on
var empdata1 emp
Voit asettaa arvot empdata1:lle as
empdata1.name = "John" empdata1.address = "Street-1, Bangalore" empdata1.age = 30
Voit myös luoda rakennemuuttujan ja määrittää arvot
empdata2 := emp{"Raj", "Building-1, Delhi", 25}
Tässä sinun on säilytettävä elementtien järjestys. Raj kartoitetaan nimeen, seuraava elementti osoitteeseen ja viimeinen ikään.
Suorita alla oleva koodi
package main import "fmt" //declared the structure named emp type emp struct { name string address string age int } //function which accepts variable of emp type and prints name property func display(e emp) { fmt.Println(e.name) } func main() { // declares a variable, empdata1, of the type emp var empdata1 emp //assign values to members of empdata1 empdata1.name = "John" empdata1.address = "Street-1, London" empdata1.age = 30 //declares and assign values to variable empdata2 of type emp empdata2 := emp{"Raj", "Building-1, Paris", 25} //prints the member name of empdata1 and empdata2 using display function display(empdata1) display(empdata2) }
ulostulo
John Raj
Menetelmät (ei toiminnot)
Metodi on funktio, jolla on vastaanottimen argumentti. Archirakenteellisesti se on func-avainsanan ja menetelmän nimen välissä. Metodin syntaksi on
func (variable variabletype) methodName(parameter1 paramether1type) { }
Muunnetaan yllä oleva esimerkkiohjelma käyttämään menetelmiä funktion sijaan.
package main import "fmt" //declared the structure named emp type emp struct { name string address string age int } //Declaring a function with receiver of the type emp func(e emp) display() { fmt.Println(e.name) } func main() { //declaring a variable of type emp var empdata1 emp //Assign values to members empdata1.name = "John" empdata1.address = "Street-1, Lodon" empdata1.age = 30 //declaring a variable of type emp and assign values to members empdata2 := emp { "Raj", "Building-1, Paris", 25} //Invoking the method using the receiver of the type emp // syntax is variable.methodname() empdata1.display() empdata2.display() }
Go ei ole oliokieli, eikä siinä ole luokan käsitettä. Menetelmät antavat vaikutelman siitä, mitä teet olioohjelmissa, joissa luokan funktioita kutsutaan käyttämällä syntaksia objektinnimi.funktionnimi()
samanaikaisuuden
Go tukee tehtävien samanaikaista suorittamista. Se tarkoittaa, että Go voi suorittaa useita tehtäviä samanaikaisesti. Se eroaa rinnakkaisuuden käsitteestä. Rinnakkaisuudessa tehtävä jaetaan pieniin alitehtäviin ja suoritetaan rinnakkain. Mutta samanaikaisesti, useita tehtäviä suoritetaan samanaikaisesti. Samanaikaisuus saavutetaan Go-sovelluksessa Goroutine- ja kanavien avulla.
Gorutiinit
Gorutiini on toiminto, joka voi toimia samanaikaisesti muiden funktioiden kanssa. Yleensä kun toimintoa vedetään, ohjaus siirtyy kutsuttuun funktioon ja sen suorituksen jälkeen ohjaus palaa kutsuvaan funktioon. Kutsutoiminto jatkaa sitten suoritustaan. Kutsuva funktio odottaa, että kutsuttu funktio saattaa suorituksen loppuun, ennen kuin se jatkaa muiden käskyjen kanssa.
Mutta gorutiinin tapauksessa kutsutoiminto ei odota kutsutun funktion suorittamisen valmistumista. Sen suorittamista jatketaan seuraavilla lauseilla. Ohjelmassa voi olla useita gorutiineja.
Myös pääohjelma poistuu, kun se on suorittanut käskynsä, eikä se odota kutsuttujen gorutiinien valmistumista.
Goroutine kutsutaan käyttämällä avainsanaa go, jota seuraa funktiokutsu.
esimerkki
go add(x,y)
Ymmärrät gorutiinit alla olevien Golang-esimerkkien avulla. Suorita alla oleva ohjelma
package main import "fmt" func display() { for i:=0; i<5; i++ { fmt.Println("In display") } } func main() { //invoking the goroutine display() go display() //The main() continues without waiting for display() for i:=0; i<5; i++ { fmt.Println("In main") } }
Tulos tulee olemaan
In main In main In main In main In main
Täällä pääohjelma suoritti suorituksen jo ennen gorutiinin alkamista. Display() on gorutiini, joka kutsutaan syntaksin avulla
go function_name(parameter list)
Yllä olevassa koodissa main() ei odota, että display() on valmis, ja main() suoritti suorituksensa ennen kuin display() suoritti koodinsa. Joten display():n sisällä olevaa print-lausetta ei tulostettu.
Nyt muokkaamme ohjelmaa tulostamaan lausekkeet myös display():stä. Lisäämme 2 sekunnin viiveen main():n for-silmukkaan ja 1 sekunnin viiveen display() for-silmukkaan.
package main import "fmt" import "time" func display() { for i:=0; i<5; i++ { time.Sleep(1 * time.Second) fmt.Println("In display") } } func main() { //invoking the goroutine display() go display() for i:=0; i<5; i++ { time.Sleep(2 * time.Second) fmt.Println("In main") } }
Tulos on jonkin verran samanlainen kuin
In display In main In display In display In main In display In display In main In main In main
Tässä näet, että molemmat silmukat suoritetaan päällekkäin samanaikaisen suorituksen vuoksi.
Kanavat
Kanavat ovat toimintojen tapa kommunikoida keskenään. Sitä voidaan pitää välineenä, johon yksi rutiini sijoittaa tiedot ja johon toinen rutiini pääsee käsiksi Golang-palvelimella.
Kanava voidaan ilmoittaa syntaksilla
channel_variable := make(chan datatype)
Esimerkiksi:
ch := make(chan int)
Voit lähettää dataa kanavalle syntaksin avulla
channel_variable <- variable_name
esimerkki
ch <- x
Voit vastaanottaa dataa kanavalta syntaksin avulla
variable_name := <- channel_variable
esimerkki
y := <- ch
Yllä olevissa go-kieliesimerkeissä gorutiinista olet nähnyt, että pääohjelma ei odota gorutiinia. Mutta näin ei ole silloin, kun kanavat ovat mukana. Oletetaan, että jos gorutiini työntää dataa kanavalle, main() odottaa kanavatietoja vastaanottavaa käskyä, kunnes se saa tiedot.
Näet tämän alla olevissa Go-kieliesimerkeissä. Kirjoita ensin normaali gorutiini ja katso käyttäytymistä. Muokkaa sitten ohjelmaa käyttämään kanavia ja katsomaan käyttäytymistä.
Suorita alla oleva ohjelma
package main import "fmt" import "time" func display() { time.Sleep(5 * time.Second) fmt.Println("Inside display()") } func main() { go display() fmt.Println("Inside main()") }
Tulos tulee olemaan
Inside main()
Main() lopetti suorituksen ja poistui ennen kuin gorutine suorittaa. Joten näytön() sisällä olevaa tulostusta ei suoritettu.
Muokkaa nyt yllä olevaa ohjelmaa käyttääksesi kanavia ja nähdäksesi toiminnan.
package main import "fmt" import "time" func display(ch chan int) { time.Sleep(5 * time.Second) fmt.Println("Inside display()") ch <- 1234 } func main() { ch := make(chan int) go display(ch) x := <-ch fmt.Println("Inside main()") fmt.Println("Printing x in main() after taking from channel:",x) }
Tulos tulee olemaan
Inside display() Inside main() Printing x in main() after taking from channel: 1234
Tässä tapahtuu main(), kun saavutetaan x := <-ch odottaa dataa kanavalla ch. Näyttö() odottaa 5 sekuntia ja siirtää sitten tiedot kanavan ch. Main() vastaanottaessaan dataa kanavalta vapautuu ja jatkaa suoritustaan.
Lähettäjä, joka lähettää dataa kanavalle, voi sulkea kanavan ilmoittaa vastaanottajille, että kanavalle ei lisätä enää dataa. Tätä käytetään pääasiassa, kun käytät silmukkaa tiedon siirtämiseen kanavalle. Kanavan voi sulkea käyttämällä
close(channel_name)
Ja vastaanottimen päässä on mahdollista tarkistaa, onko kanava suljettu lisämuuttujan avulla, kun tietoja haetaan kanavalta käyttämällä
variable_name, status := <- channel_variable
Jos tila on True, se tarkoittaa, että olet vastaanottanut tietoja kanavalta. Jos epätosi, se tarkoittaa, että yrität lukea suljetulta kanavalta
Voit myös käyttää kanavia kommunikointiin gorutiinien välillä. Tarvitsee käyttää kahta gorutiinia – toinen työntää tiedot kanavalle ja toinen vastaanottaa tiedot kanavalta. Katso alla oleva ohjelma
package main import "fmt" import "time" //This subroutine pushes numbers 0 to 9 to the channel and closes the channel func add_to_channel(ch chan int) { fmt.Println("Send data") for i:=0; i<10; i++ { ch <- i //pushing data to channel } close(ch) //closing the channel } //This subroutine fetches data from the channel and prints it. func fetch_from_channel(ch chan int) { fmt.Println("Read data") for { //fetch data from channel x, flag := <- ch //flag is true if data is received from the channel //flag is false when the channel is closed if flag == true { fmt.Println(x) }else{ fmt.Println("Empty channel") break } } } func main() { //creating a channel variable to transport integer values ch := make(chan int) //invoking the subroutines to add and fetch from the channel //These routines execute simultaneously go add_to_channel(ch) go fetch_from_channel(ch) //delay is to prevent the exiting of main() before goroutines finish time.Sleep(5 * time.Second) fmt.Println("Inside main()") }
Tässä on 2 aliohjelmaa, joista toinen työntää tiedot kanavalle ja toinen tulostaa dataa kanavalle. Funktio add_to_channel lisää numerot 0:sta 9:ään ja sulkee kanavan. Samanaikaisesti funktio fetch_from_channel odottaa klo
x, lippu := <- ch ja kun tiedot tulevat saataville, se tulostaa tiedot. Se poistuu, kun lippu on epätosi, mikä tarkoittaa, että kanava on suljettu.
Main():n odotusaika estetään main():n poistumisesta, kunnes gorutiinit lopettavat suorituksen.
Suorita koodi ja katso tulos muodossa
Read data Send data 0 1 2 3 4 5 6 7 8 9 Empty channel Inside main()
valita
Select voidaan katsoa kytkinlauseena, joka toimii kanavilla. Tässä tapauslausekkeet ovat kanavaoperaatio. Yleensä jokaisen tapauksen lausumat yritetään lukea kanavalta. Kun jokin tapauksista on valmis (kanava on luettu), kyseiseen tapaukseen liittyvä käsky suoritetaan. Jos useita tapauksia on valmiina, se valitsee satunnaisen. Sinulla voi olla oletustapaus, joka suoritetaan, jos mikään tapauksista ei ole valmis.
Katsotaanpa alla olevaa koodia
package main import "fmt" import "time" //push data to channel with a 4 second delay func data1(ch chan string) { time.Sleep(4 * time.Second) ch <- "from data1()" } //push data to channel with a 2 second delay func data2(ch chan string) { time.Sleep(2 * time.Second) ch <- "from data2()" } func main() { //creating channel variables for transporting string values chan1 := make(chan string) chan2 := make(chan string) //invoking the subroutines with channel variables go data1(chan1) go data2(chan2) //Both case statements wait for data in the chan1 or chan2. //chan2 gets data first since the delay is only 2 sec in data2(). //So the second case will execute and exits the select block select { case x := <-chan1: fmt.Println(x) case y := <-chan2: fmt.Println(y) } }
Yllä olevan ohjelman suorittaminen antaa tuloksen:
from data2()
Tässä valintalause odottaa, että tiedot ovat saatavilla missä tahansa kanavassa. Data2() lisää dataa kanavaan 2 sekunnin lepotilan jälkeen, mikä saa toisen tapauksen suorittamaan.
Lisää oletuskoko samassa ohjelmassa olevaan valintaan ja katso tulos. Tässä valintalohkon saavuttaessa, jos missään tapauksessa kanavalla ei ole dataa valmiina, se suorittaa oletuslohkon odottamatta tietojen olevan saatavilla millekään kanavalle.
package main import "fmt" import "time" //push data to channel with a 4 second delay func data1(ch chan string) { time.Sleep(4 * time.Second) ch <- "from data1()" } //push data to channel with a 2 second delay func data2(ch chan string) { time.Sleep(2 * time.Second) ch <- "from data2()" } func main() { //creating channel variables for transporting string values chan1 := make(chan string) chan2 := make(chan string) //invoking the subroutines with channel variables go data1(chan1) go data2(chan2) //Both case statements check for data in chan1 or chan2. //But data is not available (both routines have a delay of 2 and 4 sec) //So the default block will be executed without waiting for data in channels. select { case x := <-chan1: fmt.Println(x) case y := <-chan2: fmt.Println(y) default: fmt.Println("Default case executed") } }
Tämä ohjelma antaa tulosteen:
Default case executed
Tämä johtuu siitä, että kun valintalohko saavutettiin, millään kanavalla ei ollut luettavaa dataa. Joten oletustapaus suoritetaan.
muteksi
Mutex on keskinäisen poissulkemisen lyhyt muoto. Mutexia käytetään, kun et halua sallia useiden aliohjelmien pääsyn resurssiin samanaikaisesti. Mutexillä on 2 tapaa - Lukitse ja Avaa. Mutex sisältyy synkronointipakettiin. Joten sinun on tuotava synkronointipaketti. Käskyt, jotka on suoritettava toisensa poissulkevasti, voidaan sijoittaa mutex.Lock()- ja mutex.Unlock()-sisään.
Opetetaan mutex esimerkillä, joka laskee, kuinka monta kertaa silmukka suoritetaan. Tässä ohjelmassa odotamme rutiinin suorittavan silmukan 10 kertaa ja laskuri tallennetaan summana. Kutsut tätä rutiinia 3 kertaa, joten kokonaismäärän pitäisi olla 30. Luku tallennetaan globaaliin muuttujamäärään.
Ensin suoritat ohjelman ilman mutexia
package main import "fmt" import "time" import "strconv" import "math/rand" //declare count variable, which is accessed by all the routine instances var count = 0 //copies count to temp, do some processing(increment) and store back to count //random delay is added between reading and writing of count variable func process(n int) { //loop incrementing the count by 10 for i := 0; i < 10; i++ { time.Sleep(time.Duration(rand.Int31n(2)) * time.Second) temp := count temp++ time.Sleep(time.Duration(rand.Int31n(2)) * time.Second) count = temp } fmt.Println("Count after i="+strconv.Itoa(n)+" Count:", strconv.Itoa(count)) } func main() { //loop calling the process() 3 times for i := 1; i < 4; i++ { go process(i) } //delay to wait for the routines to complete time.Sleep(25 * time.Second) fmt.Println("Final Count:", count) }
Katso tulos
Count after i=1 Count: 11 Count after i=3 Count: 12 Count after i=2 Count: 13 Final Count: 13
Tulos voi olla erilainen, kun suoritat sen, mutta lopputulos ei ole 30.
Tässä tapahtuu, että 3 gorutiinia yrittävät lisätä muuttujamäärään tallennettua silmukkamäärää. Oletetaan, että tällä hetkellä määrä on 5 ja gorotine1 kasvattaa määrää kuuteen.
Kopioi määrä lämpötilaan
Nosta lämpötilaa
Tallenna lämpötila takaisin laskeaksesi
Oletetaan pian sen jälkeen, kun olet suorittanut vaiheen 3 goroutine1:llä; toisella gorutiinilla voi olla vanha arvo, eli 3 tekee yllä olevat vaiheet ja tallentaa 4 takaisin, mikä on väärin. Tämä voidaan estää käyttämällä mutexia, joka saa muut rutiinit odottamaan, kun yksi rutiini jo käyttää muuttujaa.
Nyt suoritat ohjelman mutexilla. Tässä yllä mainitut 3 vaihetta suoritetaan mutexissa.
package main import "fmt" import "time" import "sync" import "strconv" import "math/rand" //declare a mutex instance var mu sync.Mutex //declare count variable, which is accessed by all the routine instances var count = 0 //copies count to temp, do some processing(increment) and store back to count //random delay is added between reading and writing of count variable func process(n int) { //loop incrementing the count by 10 for i := 0; i < 10; i++ { time.Sleep(time.Duration(rand.Int31n(2)) * time.Second) //lock starts here mu.Lock() temp := count temp++ time.Sleep(time.Duration(rand.Int31n(2)) * time.Second) count = temp //lock ends here mu.Unlock() } fmt.Println("Count after i="+strconv.Itoa(n)+" Count:", strconv.Itoa(count)) } func main() { //loop calling the process() 3 times for i := 1; i < 4; i++ { go process(i) } //delay to wait for the routines to complete time.Sleep(25 * time.Second) fmt.Println("Final Count:", count) }
Nyt tulos tulee olemaan
Count after i=3 Count: 21 Count after i=2 Count: 28 Count after i=1 Count: 30 Final Count: 30
Tästä saamme lopputulokseksi odotetun tuloksen. Koska lausekkeet, jotka lukevat, lisäävät ja kirjoittavat laskun takaisin, suoritetaan mutexissa.
Virheiden käsittely
Virheet ovat epänormaaleja olosuhteita, kuten tiedoston sulkeminen, jota ei avata, avaamaton tiedosto jne. Toiminnot palauttavat yleensä virheet viimeisenä palautusarvona.
Alla oleva esimerkki selittää enemmän virheestä.
package main import "fmt" import "os" //function accepts a filename and tries to open it. func fileopen(name string) { f, er := os.Open(name) //er will be nil if the file exists else it returns an error object if er != nil { fmt.Println(er) return }else{ fmt.Println("file opened", f.Name()) } } func main() { fileopen("invalid.txt") }
Tuotos on:
open /invalid.txt: no such file or directory
Täällä yritimme avata tiedoston, jota ei ole olemassa, ja se palautti virheen muuttujaan er. Jos tiedosto on kelvollinen, virhe on tyhjä
Mukautetut virheet
Tämän ominaisuuden avulla voit luoda mukautettuja virheitä. Tämä tehdään käyttämällä virhepaketin New()-komentoa. Kirjoitamme yllä olevan ohjelman uudelleen hyödyntämään mukautettuja virheitä.
Suorita alla oleva ohjelma
package main import "fmt" import "os" import "errors" //function accepts a filename and tries to open it. func fileopen(name string) (string, error) { f, er := os.Open(name) //er will be nil if the file exists else it returns an error object if er != nil { //created a new error object and returns it return "", errors.New("Custom error message: File name is wrong") }else{ return f.Name(),nil } } func main() { //receives custom error or nil after trying to open the file filename, error := fileopen("invalid.txt") if error != nil { fmt.Println(error) }else{ fmt.Println("file opened", filename) } }
Tuotos on:
Custom error message:File name is wrong
Tässä area() palauttaa neliön alueen. Jos syöte on pienempi kuin 1, alue() palauttaa virheilmoituksen.
Tiedostojen lukeminen
Tiedostoja käytetään tietojen tallentamiseen. Go antaa meille mahdollisuuden lukea tietoja tiedostoista
Luo ensin tiedosto data.txt nykyiseen hakemistoosi alla olevan sisällön kanssa.
Line one Line two Line three
Suorita nyt alla oleva ohjelma nähdäksesi, että se tulostaa koko tiedoston sisällön tulosteena
package main import "fmt" import "io/ioutil" func main() { data, err := ioutil.ReadFile("data.txt") if err != nil { fmt.Println("File reading error", err) return } fmt.Println("Contents of file:", string(data)) }
Tässä tiedot, err := ioutil.ReadFile("data.txt") lukee tiedot ja palauttaa tavusekvenssin. Tulostuksen aikana se muunnetaan merkkijonomuotoon.
Tiedostojen kirjoittaminen
Näet tämän ohjelman avulla
package main import "fmt" import "os" func main() { f, err := os.Create("file1.txt") if err != nil { fmt.Println(err) return } l, err := f.WriteString("Write Line one") if err != nil { fmt.Println(err) f.Close() return } fmt.Println(l, "bytes written") err = f.Close() if err != nil { fmt.Println(err) return } }
Täällä luodaan tiedosto, test.txt. Jos tiedosto on jo olemassa, tiedoston sisältö katkaistaan. Writeline()-funktiota käytetään tiedoston sisällön kirjoittamiseen. Sen jälkeen suljit tiedoston Close()-komennolla.
Cheat Sheet
Tässä Go-opetusohjelmassa käsittelimme
Aihe | Tuotetiedot | Syntaksi |
---|---|---|
Perustyypit | Numero, merkkijono, bool | |
Muuttujat | Ilmoita ja anna muuttujille arvoja | muuttujan_nimityyppi var muuttujan_nimi tyyppi = arvo muuttujan_nimi1, muuttujan_nimi2 = arvo1, arvo2 muuttujan_nimi := arvo |
vakiot | Muuttujat, joiden arvoa ei voi muuttaa kerran määritettynä | const muuttuja = arvo |
Loopille | Suorita lauseet silmukassa. | alustus_ilmaisua varten; arviointi_ilmaus; iteraatio_lauseke{ // yksi tai useampi lausunto } |
Tai muuten | Se on ehdollinen lausunto | if condition{ // lausunnot_1 Else {} // lausunnot_2 } |
kytkin | Ehdollinen lausunto, jossa on useita tapauksia | vaihtaa lauseke { case value_1: lausunnot_1 case value_2: lausunnot_2 case value_n: lausunnot_n default: lausunnot_oletus } |
Ryhmä | Kiinteäkokoinen nimetty samantyyppisten elementtien sarja | arrayname := [koko] tyyppi {arvo_0,arvo_1,…,arvo_koko-1} |
Viipale | Osa tai segmentti taulukosta | var slice_name [] type = taulukon_nimi[aloitus:loppu] |
Tehtävät | Lausekkeiden lohko, joka suorittaa tietyn tehtävän | func funktion_nimi(parametrin_1 tyyppi, parametrin_n tyyppi) return_type { //lausunnot } |
Jäsenyydet | Käytetään koodin järjestämiseen. Lisää koodin luettavuutta ja uudelleenkäytettävyyttä | tuo paketin_nimi |
Lykätä | Lykkää funktion suorittamista, kunnes sisältävä funktio lopettaa suorituksen | lykkää funktion_nimi(parametriluettelo) |
Osoittimet | Tallentaa toisen muuttujan muistiosoitteen. | muuttujan_nimi *tyyppi |
Tuote mallit | Käyttäjän määrittämä tietotyyppi, joka itsessään sisältää yhden saman tai eri tyyppisen elementin lisää | kirjoita rakenteen nimi struct { muuttuja_1 muuttuja_1_tyyppi muuttuja_2 muuttuja_2_tyyppi muuttuja_n muuttujan_n_tyyppi } |
Menetelmät | Metodi on funktio, jolla on vastaanottimen argumentti | func (muuttujatyyppi) methodName(parameter_list) { } |
Gorutine | Toiminto, joka voi toimia samanaikaisesti muiden toimintojen kanssa. | go function_name(parameter_list) |
Kanava | Toimintojen tapa kommunikoida keskenään. Tietoväline, johon yksi rutiini sijoittaa tietoja ja johon toinen rutiini pääsee käsiksi. | Julistaa: ch := make(chan int) Lähetä tiedot kanavalle: kanavamuuttuja <- muuttujan_nimi Vastaanota kanavalta: muuttujan_nimi := <- kanavamuuttuja |
valita | Kanavilla toimiva vaihtoilmoitus. Tapauslausekkeet ovat kanavaoperaatio. Kun jokin kanava on valmis tietojen kanssa, kyseiseen tapaukseen liittyvä käsky suoritetaan | valitse { tapaus x := <-chan1: fmt.Println(x) tapaus y := <-chan2: fmt.Println(y) } |
muteksi | Mutexia käytetään, kun et halua sallia useiden aliohjelmien pääsyn resurssiin samanaikaisesti. Mutexillä on 2 tapaa – Lock and Unlock | mutex.Lock() //lausunnot mutex.Unlock(). |
Lue tiedostoja | Lukee tiedot ja palauttaa tavusekvenssin. | Data, err := ioutil.ReadFile(tiedostonimi) |
Kirjoita tiedosto | Kirjoittaa dataa tiedostoon | l, err := f.WriteString(kirjoitettava_teksti) |