Golang opetusohjelma
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) |
