Golang-vejledning
Hvad er Go?
Go (ogsรฅ kendt som Golang) er et open source programmeringssprog udviklet af Google. Det er et statisk skrevet kompileret sprog. Go understรธtter samtidig programmering, dvs. det tillader at kรธre flere processer samtidigt. Dette opnรฅs ved hjรฆlp af kanaler, goroutiner osv. Go Language har skraldopsamling, som selv udfรธrer hukommelseshรฅndteringen og tillader udskudt udfรธrelse af funktioner.
Vi vil lรฆre alt det grundlรฆggende om Golang i denne Lรฆr Go Language Tutorial.
Sรฅdan downloades og installeres GO
Trin 1) Gรฅ til https://golang.org/dl/. Download binรฆr til dit OS.
Trin 2) Double klik pรฅ installationsprogrammet og klik pรฅ Kรธr.
Trin 3) Klik pรฅ Nรฆste

Trin 4) Vรฆlg installationsmappen, og klik pรฅ Nรฆste.

Trin 5) Klik pรฅ Udfรธr, nรฅr installationen er fuldfรธrt.

Trin 6) Nรฅr installationen er fรฆrdig, kan du bekrรฆfte den ved at รฅbne terminalen og skrive
go version
Dette vil vise versionen af โโgo installeret

Dit First Go-program โ Go Hello World!
Opret en mappe kaldet studyGo. I denne Go-sprogtutorial vil vi oprette vores go-programmer i denne mappe. Go-filer oprettes med udvidelsen .gรฅ. Du kan kรธre Go-programmer ved hjรฆlp af syntaksen
go run <filename>
Opret en fil kaldet first.go og tilfรธj nedenstรฅende kode i den og gem
package main
import ("fmt")
func main() {
fmt.Println("Hello World! This is my first Go program\n")
}

Naviger til denne mappe i din terminal. Kรธr programmet ved hjรฆlp af kommandoen
gรฅ lรธb fรธrst.gรฅ
Du kan se output-udskrivningen
Hello World! This is my first Go program

Lad os nu diskutere ovenstรฅende program.
hovedpakke โ Hvert Go Language-program skal starte med et pakkenavn. Go giver os mulighed for at bruge pakker i andre go-programmer og understรธtter derfor genbrugbar kode. Udfรธrelse af et Go-program begynder med koden inde i pakken med navnet main.
import fmt โ importerer pakken fmt. Denne pakke implementerer I/O-funktionerne.
func main() โ Dette er den funktion, hvorfra programafviklingen begynder. Hovedfunktionen skal altid placeres i hovedpakken. Under main() kan du skrive koden inde i { }.
fmt.Println โ Dette vil udskrive teksten pรฅ skรฆrmen ved hjรฆlp af Println-funktionen i fmt.
Bemรฆrk: I nedenstรฅende sektioner af denne Go-tutorial, nรฅr du nรฆvner eksekver/kรธr koden, betyder det at gemme koden i en fil med .go-udvidelsen og kรธre den ved hjรฆlp af syntaksen
go run <filename>
Datatyper
Typer (datatyper) reprรฆsenterer typen af โโvรฆrdien gemt i en variabel, typen af โโvรฆrdien en funktion returnerer osv.
Der er tre grundlรฆggende typer i Go Language
Numeriske typer โ Reprรฆsenterer numeriske vรฆrdier, som inkluderer heltal, flydende komma og komplekse vรฆrdier. Forskellige numeriske typer er:
int8 โ 8 bit signerede heltal.
int16 โ 16 bit signerede heltal.
int32 โ 32 bit signerede heltal.
int64 โ 64 bit signerede heltal.
uint8 โ 8 bit usignerede heltal.
uint16 โ 16 bit usignerede heltal.
uint32 โ 32 bit usignerede heltal.
uint64 โ 64 bit usignerede heltal.
flydende 32 โ 32 bit flydende kommatal.
flydende 64 โ 64 bit flydende kommatal.
complex64 โ har float32 reelle og imaginรฆre dele.
complex128 โ har float32 reelle og imaginรฆre dele.
Strengetyper โ Reprรฆsenterer en sekvens af bytes(tegn). Du kan udfรธre forskellige operationer pรฅ strenge som strengsammenkรฆdning, udtrรฆkning af understreng osv
booleske typer โ Reprรฆsenterer 2 vรฆrdier, enten sande eller falske.
Golang grรฆnseflade
Golang grรฆnseflade er en samling af metodesignaturer, der bruges af en Type til at implementere objekters adfรฆrd. Hovedmรฅlet med Golang-grรฆnsefladen er at give metodesignaturer med navne, argumenter og returtyper. Det er op til en Type at erklรฆre og implementere metoden. En grรฆnseflade i Golang kan erklรฆres ved hjรฆlp af sรธgeordet "grรฆnseflade".
Variabler
Variabler peger pรฅ en hukommelsesplacering, som gemmer en form for vรฆrdi. Typeparameteren (i nedenstรฅende syntaks) reprรฆsenterer den type vรฆrdi, der kan gemmes i hukommelsesplaceringen.
Variabel kan erklรฆres ved hjรฆlp af syntaksen
var <variable_name> <type>
Nรฅr du erklรฆrer en variabel af en type, kan du tildele variablen til enhver vรฆrdi af den type.
Du kan ogsรฅ give en startvรฆrdi til en variabel under selve deklarationen ved hjรฆlp af
var <variable_name> <type> = <value>
Hvis du erklรฆrer variablen med en begyndelsesvรฆrdi, skal du gรฅ og udlede variablens type ud fra den tildelte vรฆrditype. Sรฅ du kan udelade typen under erklรฆringen ved hjรฆlp af syntaksen
var <variable_name> = <value>
Du kan ogsรฅ erklรฆre flere variabler med syntaksen
var <variable_name1>, <variable_name2> = <value1>, <value2>
Nedenstรฅende program i denne Go-tutorial har nogle Golang-eksempler pรฅ variable erklรฆringer
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)
}
Udgangen bliver
x: 3 y: 20 z: 50 i and j: 100 hello
Go Language giver ogsรฅ en nem mรฅde at erklรฆre variablerne med vรฆrdi ved at udelade nรธgleordet var ved at bruge
<variable_name> := <value>
Bemรฆrk, at du brugte := i stedet for =. Du kan ikke bruge := bare til at tildele en vรฆrdi til en variabel, som allerede er deklareret. := bruges til at erklรฆre og tildele vรฆrdi.
Opret en fil kaldet assign.go med fรธlgende kode
package main
import ("fmt")
func main() {
a := 20
fmt.Println(a)
//gives error since a is already declared
a := 30
fmt.Println(a)
}
Udfรธr go run assign.go for at se resultatet som
./assign.go:7:4: no new variables on left side of :=
Variabler erklรฆret uden en startvรฆrdi vil have 0 for numeriske typer, falsk for boolesk og tom streng for strenge
Konstanter
Konstante variabler er de variable, hvis vรฆrdi ikke kan รฆndres, nรฅr de fรธrst er tildelt. En konstant i Go programmeringssprog erklรฆres ved at bruge sรธgeordet "const"
Opret en fil kaldet constant.go og med fรธlgende kode
package main
import ("fmt")
func main() {
const b =10
fmt.Println(b)
b = 30
fmt.Println(b)
}
Udfรธr go run constant.go for at se resultatet som
.constant.go:7:4: cannot assign to b
For lรธkkeeksempler
Slรธjfer bruges til at udfรธre en blok af udsagn gentagne gange baseret pรฅ en betingelse. De fleste programmeringssprog giver 3 typer loops - for, mens, do while. Men Go-programmeringssproget understรธtter kun loop.
Syntaksen for en Golang for loop er
for initialisation_expression; evaluation_expression; iteration_expression{
// one or more statement
}
Initialiseringsudtrykket udfรธres fรธrst (og kun รฉn gang) i Golang for loop.
Derefter evalueres evaluation_expression, og hvis det er sandt, udfรธres koden inde i blokken.
Iteration_expression-id'et udfรธres, og evaluation_expression evalueres igen. Hvis det er sandt, udfรธres sรฆtningsblokken igen. Dette vil fortsรฆtte, indtil evaluation_expression bliver falsk.
Kopier nedenstรฅende program ind i en fil og kรธr den for at se Golang for loop-udskrivningsnumre fra 1 til 5
package main
import "fmt"
func main() {
var i int
for i = 1; i <= 5; i++ {
fmt.Println(i)
}
}
Output er
1 2 3 4 5
Hvis ellers
Hvis andet er en betinget erklรฆring. Synaksen er
if condition{
// statements_1
}else{
// statements_2
}
Her evalueres betingelsen, og hvis den er sand, vil statements_1 blive eksekveret, ellers vil statements_2 blive eksekveret.
Du kan ogsรฅ bruge if-sรฆtning uden andet. Du kan ogsรฅ have lรฆnket if else-udsagn. Nedenstรฅende programmer vil forklare mere om, hvis andet.
Udfรธr nedenstรฅende program. Den kontrollerer, om et tal, x, er mindre end 10. Hvis det er tilfรฆldet, vil den udskrive "x er mindre end 10"
package main
import "fmt"
func main() {
var x = 50
if x < 10 {
//Executes if x < 10
fmt.Println("x is less than 10")
}
}
Da vรฆrdien af โโx her er stรธrre end 10, vil sรฆtningen inde i if-blokbetingelsen ikke blive udfรธrt.
Se nu nedenstรฅende program. I denne Go-programmeringssprogstutorial har vi en anden blok, som vil blive udfรธrt ved fejl i if-evaluering.
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")
}
}
Dette program vil give dig output
x is greater than or equals 10
Nu i denne Go-tutorial vil vi se et program med flere if else-blokke (kรฆdet hvis andet). Udfรธr nedenstรฅende Go-eksempel. Den kontrollerer, om et tal er mindre end 10 eller er mellem 10-90 eller stรธrre end 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")
}
}
Her kontrollerer fรธrst if-betingelsen, om x er mindre end 10, og det er den ikke. Sรฅ det tjekker den nรฆste betingelse (ellers hvis), om den er mellem 10 og 90, hvilket ogsรฅ er falsk. Sรฅ den udfรธrer derefter blokken under else-sektionen, som giver output
x is greater than 90
Kontakt
Switch er en anden betinget erklรฆring. Switch-sรฆtninger evaluerer et udtryk, og resultatet sammenlignes med et sรฆt tilgรฆngelige vรฆrdier(cases). Nรฅr et match er fundet, udfรธres de udsagn, der er knyttet til det match(casus). Hvis der ikke findes noget match, vil intet blive udfรธrt. Du kan ogsรฅ tilfรธje en standard case til at skifte, som vil blive udfรธrt, hvis der ikke findes andre matches. Syntaksen for switchen er
switch expression {
case value_1:
statements_1
case value_2:
statements_2
case value_n:
statements_n
default:
statements_default
}
Her sammenlignes udtrykkets vรฆrdi med vรฆrdierne i hvert enkelt tilfรฆlde. Nรฅr et match er fundet, udfรธres de erklรฆringer, der er knyttet til den pรฅgรฆldende sag. Hvis der ikke findes noget match, udfรธres sรฆtningerne under standardafsnittet.
Udfรธr nedenstรฅende program
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")
}
}
Du fรฅr output som
Sum is 3
รndre vรฆrdien af โโa og b til 3 og resultatet bliver
Printing default
Du kan ogsรฅ have flere vรฆrdier i en sag ved at adskille dem med et komma.
Arrays
Array reprรฆsenterer en fast stรธrrelse, navngivet sekvens af elementer af samme type. Du kan ikke have en matrix, der indeholder bรฅde heltal og tegn. Du kan ikke รฆndre stรธrrelsen pรฅ et array, nรฅr fรธrst du har defineret stรธrrelsen.
Syntaksen til at erklรฆre et array er
var arrayname [size] type
Hvert array-element kan tildeles vรฆrdi ved hjรฆlp af syntaksen
arrayname [index] = value
Array-indeks starter fra 0 til stรธrrelse-1.
Du kan tildele vรฆrdier til matrixelementer under erklรฆringen ved hjรฆlp af syntaksen
arrayname := [size] type {value_0,value_1,โฆ,value_size-1}
Du kan ogsรฅ ignorere stรธrrelsesparameteren, mens du erklรฆrer arrayet med vรฆrdier ved at erstatte stรธrrelse med ... og compileren vil finde lรฆngden ud fra antallet af vรฆrdier. Syntaks er
arrayname := [โฆ] type {value_0,value_1,โฆ,value_size-1}
Du kan finde lรฆngden af โโarrayet ved at bruge syntaksen
len(arrayname)
Udfรธr nedenstรฅende Go-eksempel for at forstรฅ arrayet
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])
}
Produktion
Two 3 [One Two Three] [1 2 3 4 5] 5
Golang Slice and Append-funktion
En skive er en del eller et segment af et array. Eller det er en visning eller delvis visning af en underliggende matrix, som den peger pรฅ. Du kan fรฅ adgang til elementerne i et udsnit ved hjรฆlp af udsnitsnavnet og indeksnummeret, ligesom du gรธr i et array. Du kan ikke รฆndre lรฆngden af โโet array, men du kan รฆndre stรธrrelsen pรฅ et udsnit.
Indholdet af en skive er faktisk pejlemรฆrkerne til elementerne i et array. Det betyder hvis du รฆndrer et element i et udsnit, vil det underliggende matrixindhold ogsรฅ blive pรฅvirket.
Syntaksen for at oprette et udsnit er
var slice_name [] type = array_name[start:end]
Dette vil oprette et udsnit ved navn udsnit_navn fra et array ved navn array_navn med elementerne ved indekset start til slut-1.
Nu i denne Golang tutorial, vil vi udfรธre nedenstรฅende program. Programmet vil oprette et udsnit fra arrayet og udskrive det. Du kan ogsรฅ se, at รฆndring af indholdet i udsnittet vil รฆndre det faktiske array.
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)
}
Dette vil udskrive resultatet som
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]
Der er visse funktioner som Golang len, Golang append, som du kan anvende pรฅ skiver
len(slice_name) โ returnerer lรฆngden af โโskiven
tilfรธje(udsnit_navn, vรฆrdi_1, vรฆrdi_2) โ Golang append bruges til at tilfรธje vรฆrdi_1 og vรฆrdi_2 til et eksisterende udsnit.
tilfรธje(udsnit_nale1,udsnit_navn2...) โ fรธjer udsnit_navn2 til udsnit_navn1
Udfรธr fรธlgende program.
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)
}
Udgangen bliver
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]
Programmet opretter fรธrst 2 skiver og udskrev dens lรฆngde. Derefter fรธjede den en skive til den anden og fรธjede derefter en streng til den resulterende skive.
Funktioner
En funktion reprรฆsenterer en blok af udsagn, som udfรธrer en bestemt opgave. En funktionserklรฆring fortรฆller os funktionsnavn, returtype og inputparametre. Funktionsdefinition reprรฆsenterer koden indeholdt i funktionen. Syntaksen til at erklรฆre funktionen er
func function_name(parameter_1 type, parameter_n type) return_type {
//statements
}
Parametrene og returtyperne er valgfrie. Du kan ogsรฅ returnere flere vรฆrdier fra en funktion.
Lad os nu i denne Golang-tutorial kรธre fรธlgende Golang-eksempel. Her vil en funktion kaldet calc acceptere 2 tal og udfรธre addition og subtraktion og returnerer begge vรฆrdier.
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)
}
Udgangen bliver
Sum 25 Diff 5
Pakker
Pakker bruges til at organisere koden. I et stort projekt er det ikke muligt at skrive kode i en enkelt fil. Go programmeringssprog giver os mulighed for at organisere koden under forskellige pakker. Dette รธger kodelรฆsbarheden og genbrugbarheden. Et eksekverbart Go-program bรธr indeholde en pakke med navnet main, og programafviklingen starter fra funktionen med navnet main. Du kan importere andre pakker i vores program ved hjรฆlp af syntaksen
import package_name
Vi vil se og diskutere i denne Golang-tutorial, hvordan man opretter og bruger pakker i det fรธlgende Golang-eksempel.
Trin 1) Opret en fil kaldet package_example.go og tilfรธj nedenstรฅende kode
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)
}
I ovenstรฅende program er fmt en pakke, som Go-programmeringssproget giver os hovedsageligt til I/O-formรฅl. Du kan ogsรฅ se en pakke med navnet beregning. Inde i main() kan du se en trinsum := beregning.Do_add(x,y). Det betyder, at du aktiverer funktionen Do_add fra pakkeberegning.
Trin 2) Fรธrst skal du oprette pakkeberegningen inde i en mappe med samme navn under src-mappen pรฅ farten. Den installerede sti til go kan findes fra PATH-variablen.
For mac, find stien ved at udfรธre echo $PATH

Sรฅ stien er /usr/local/go
For Windows, find stien ved at udfรธre echo %GOROOT%

Her er stien C:\Go\
Trin 3) Naviger til mappen src (/usr/local/go/src til mac og C:\Go\src til Windows). Nu fra koden er pakkenavnet beregning. Go krรฆver, at pakken skal placeres i en mappe af samme navn under src-mappen. Opret en mappe med navnet beregning i mappen src.
Trin 4) Opret en fil kaldet calc.go (Du kan give et hvilket som helst navn, men pakkenavnet i koden betyder noget. Her skal det vรฆre beregning) inde i beregningsmappen og tilfรธj nedenstรฅende kode
package calculation
func Do_add(num1 int, num2 int)(int) {
sum := num1 + num2
return sum
}
Trin 5) Kรธr kommandoen go install fra beregningsmappen, som vil kompilere calc.go.

Trin 6) Gรฅ nu tilbage til package_example.go og kรธr go run package_example.go. Outputtet vil vรฆre Sum 25.
Bemรฆrk, at navnet pรฅ funktionen Do_add starter med et stort bogstav. Dette skyldes, at i Go, hvis funktionsnavnet starter med et stort bogstav, betyder det, at andre programmer kan se (fรฅ adgang), ellers kan andre programmer ikke fรฅ adgang til det. Hvis funktionsnavnet var do_add , sรฅ ville du have fรฅet fejlen
kan ikke henvise til ueksporteret navneberegning.beregning..
Defer og stabling udskyder
Defer-sรฆtninger bruges til at udskyde udfรธrelsen af โโet funktionskald, indtil funktionen, der indeholder defer-sรฆtningen, fuldfรธrer udfรธrelsen.
Lad os lรฆre dette med et eksempel:
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()")
}
Udgangen bliver
Inside the main() Inside the sample()
Her udsรฆttes udfรธrelsen af โโsample() indtil udfรธrelsen af โโden omsluttende funktion(main()) er fuldfรธrt.
Stacking defer bruger flere defer-udsagn. Antag, at du har flere defer-sรฆtninger inde i en funktion. Go placerer alle de udskudte funktionskald i en stak, og nรฅr den omsluttende funktion vender tilbage, udfรธres de stablede funktioner i Last In First Out (LIFO) rรฆkkefรธlge. Du kan se dette i eksemplet nedenfor.
Udfรธr nedenstรฅende kode
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)
}
Udgangen bliver
4 3 2 1
Her udfรธres koden inde i main() fรธrst, og derefter udfรธres de udskudte funktionskald i omvendt rรฆkkefรธlge, dvs. 4, 3,2,1.
Pointers
Fรธr vi forklarer pointer, lad os fรธrst diskutere '&'-operatoren. Operatoren '&' bruges til at fรฅ adressen pรฅ en variabel. Det betyder, at '&a' vil udskrive hukommelsesadressen for variabel a.
I denne Golang tutorial vil vi udfรธre nedenstรฅende program for at vise vรฆrdien af โโen variabel og adressen pรฅ den variabel
package main
import "fmt"
func main() {
a := 20
fmt.Println("Address:",&a)
fmt.Println("Value:",a)
}
Resultatet bliver
Address: 0xc000078008 Value: 20
En pointervariabel gemmer hukommelsesadressen for en anden variabel. Du kan definere en markรธr ved hjรฆlp af syntaksen
var variable_name *type
Stjernen(*) reprรฆsenterer variablen er en pointer. Du vil forstรฅ mere ved at udfรธre nedenstรฅende program
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)}
Udgangen bliver
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
Strukturer
En struktur er en brugerdefineret datatype, som i sig selv indeholder et element mere af samme eller anden type.
Brug af en struktur er en 2-trins proces.
Fรธrst skal du oprette (erklรฆre) en strukturtype
For det andet skal du oprette variabler af den type for at gemme vรฆrdier.
Strukturer bruges hovedsageligt, nรฅr du vil gemme relaterede data sammen.
Overvej et stykke medarbejderinformation, som har navn, alder og adresse. Du kan hรฅndtere dette pรฅ 2 mรฅder
Opret 3 arrays โ et array gemmer medarbejdernes navne, et lagrer alder og det tredje lagrer alder.
Angiv en strukturtype med 3 felter - navn, adresse og alder. Opret en matrix af den strukturtype, hvor hvert element er et strukturobjekt med navn, adresse og alder.
Den fรธrste tilgang er ikke effektiv. I den slags scenarier er strukturer mere bekvemme.
Syntaksen til at erklรฆre en struktur er
type structname struct {
variable_1 variable_1_type
variable_2 variable_2_type
variable_n variable_n_type
}
Et eksempel pรฅ en strukturdeklaration er
type emp struct {
name string
address string
age int
}
Her oprettes en ny brugerdefineret type ved navn emp. Nu kan du oprette variabler af typen emp ved hjรฆlp af syntaksen
var variable_name struct_name
Et eksempel er
var empdata1 emp
Du kan indstille vรฆrdier for empdata1 as
empdata1.name = "John" empdata1.address = "Street-1, Bangalore" empdata1.age = 30
Du kan ogsรฅ oprette en strukturvariabel og tildele vรฆrdier ved
empdata2 := emp{"Raj", "Building-1, Delhi", 25}
Her skal du bevare rรฆkkefรธlgen af โโelementer. Raj vil blive kortlagt til navn, nรฆste element til adresse og det sidste til alder.
Udfรธr koden nedenfor
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)
}
Produktion
John Raj
Metoder (ikke funktioner)
En metode er en funktion med et modtagerargument. Archirent teknisk er det mellem func nรธgleordet og metodenavnet. Syntaksen for en metode er
func (variable variabletype) methodName(parameter1 paramether1type) {
}
Lad os konvertere ovenstรฅende eksempelprogram til at bruge metoder i stedet for funktion.
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 er ikke et objektorienteret sprog, og det har ikke begrebet klasse. Metoder giver en fornemmelse af, hvad du gรธr i objektorienterede programmer, hvor funktionerne i en klasse pรฅkaldes ved hjรฆlp af syntaksen objektnavn.funktionsnavn()
samtidighed
Go understรธtter samtidig udfรธrelse af opgaver. Det betyder, at Go kan udfรธre flere opgaver samtidigt. Det er forskelligt fra begrebet parallelisme. I parallelisme er en opgave opdelt i smรฅ delopgaver og udfรธres parallelt. Men samtidig udfรธres flere opgaver samtidigt. Samtidig opnรฅs i Go ved hjรฆlp af Goroutines og Channels.
Goroutiner
En goroutine er en funktion, der kan kรธre samtidig med andre funktioner. Normalt, nรฅr en funktion pรฅkaldes, overfรธres kontrollen til den kaldte funktion, og nรฅr dens afsluttede udfรธrelseskontrol vender tilbage til den kaldende funktion. Den kaldende funktion fortsรฆtter derefter sin udfรธrelse. Den kaldende funktion venter pรฅ, at den pรฅkaldte funktion fuldfรธrer udfรธrelsen, fรธr den fortsรฆtter med resten af โโsรฆtningerne.
Men i tilfรฆlde af goroutine, vil den kaldende funktion ikke vente pรฅ, at udfรธrelsen af โโden pรฅkaldte funktion er fuldfรธrt. Det vil fortsรฆtte med at udfรธre med de nรฆste erklรฆringer. Du kan have flere goroutiner i et program.
Hovedprogrammet afsluttes ogsรฅ, nรฅr det er fรฆrdigt med at udfรธre sine udsagn, og det vil ikke vente pรฅ fรฆrdiggรธrelsen af โโde pรฅberรฅbte goroutiner.
Goroutine pรฅkaldes ved hjรฆlp af nรธgleordet go efterfulgt af et funktionskald.
Eksempel
go add(x,y)
Du vil forstรฅ goroutiner med nedenstรฅende Golang-eksempler. Udfรธr nedenstรฅende program
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")
}
}
Udgangen bliver
In main In main In main In main In main
Her afsluttede hovedprogrammet eksekveringen, allerede fรธr goroutinen startede. Display() er en goroutine, som fremkaldes ved hjรฆlp af syntaksen
go function_name(parameter list)
I ovenstรฅende kode venter main() ikke pรฅ, at display() er fรฆrdig, og main() fuldfรธrte sin udfรธrelse, fรธr display() udfรธrte sin kode. Sรฅ print-erklรฆringen inde i display() blev ikke udskrevet.
Nu รฆndrer vi programmet til ogsรฅ at udskrive udsagn fra display(). Vi tilfรธjer en tidsforsinkelse pรฅ 2 sek. i for-lรธkken i main() og en forsinkelse pรฅ 1 sek. i for-lรธkken pรฅ display().
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")
}
}
Outputtet vil ligne noget
In display In main In display In display In main In display In display In main In main In main
Her kan du se, at begge loops udfรธres pรฅ en overlappende mรฅde pรฅ grund af den samtidige udfรธrelse.
Kanaler
Kanaler er en mรฅde, hvorpรฅ funktioner kan kommunikere med hinanden. Det kan opfattes som et medium til, hvor en rutine placerer data og tilgรฅs af en anden rutine i Golang-serveren.
En kanal kan erklรฆres med syntaksen
channel_variable := make(chan datatype)
Eksempel:
ch := make(chan int)
Du kan sende data til en kanal ved hjรฆlp af syntaksen
channel_variable <- variable_name
Eksempel
ch <- x
Du kan modtage data fra en kanal ved hjรฆlp af syntaksen
variable_name := <- channel_variable
Eksempel
y := <- ch
I ovenstรฅende Go-sprogeksempler pรฅ goroutine har du set, at hovedprogrammet ikke venter pรฅ goroutinen. Men det er ikke tilfรฆldet, nรฅr kanaler er involveret. Antag, at hvis en goroutine skubber data til kanal, vil main() vente pรฅ sรฆtningen, der modtager kanaldata, indtil den fรฅr dataene.
Du vil se dette i nedenstรฅende Go sprogeksempler. Skriv fรธrst en normal goroutine og se adfรฆrden. Rediger derefter programmet til at bruge kanaler og se adfรฆrden.
Udfรธr nedenstรฅende program
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()")
}
Udgangen bliver
Inside main()
Main() afsluttede udfรธrelsen og afsluttede fรธr goroutinen eksekveres. Sรฅ udskriften inde i display() blev ikke udfรธrt.
Rediger nu ovenstรฅende program for at bruge kanaler og se adfรฆrden.
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)
}
Udgangen bliver
Inside display() Inside main() Printing x in main() after taking from channel: 1234
Her, hvad der sker, er main() ved at nรฅ x := <-ch vil vente pรฅ data pรฅ kanal ch. Displayet() har en ventetid pรฅ 5 sekunder og skubber derefter data til kanalen ch. Main() ved modtagelse af data fra kanalen bliver blokeret og fortsรฆtter sin eksekvering.
Afsenderen, der pusher data til kanal, kan informere modtagerne om, at der ikke vil blive tilfรธjet flere data til kanalen ved at lukke kanalen. Dette bruges hovedsageligt, nรฅr du bruger en loop til at skubbe data til en kanal. En kanal kan lukkes vha
close(channel_name)
Og i modtagerenden er det muligt at kontrollere, om kanalen er lukket ved hjรฆlp af en ekstra variabel, mens der hentes data fra kanalen vha.
variable_name, status := <- channel_variable
Hvis status er Sand, betyder det, at du har modtaget data fra kanalen. Hvis falsk, betyder det, at du forsรธger at lรฆse fra en lukket kanal
Du kan ogsรฅ bruge kanaler til kommunikation mellem goroutiner. Skal bruge 2 goroutiner - den ene skubber data til kanalen og den anden modtager dataene fra kanalen. Se nedenstรฅende program
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()")
}
Her er der 2 underrutiner, den ene skubber data til kanalen og den anden udskriver data til kanalen. Funktionen add_to_channel tilfรธjer tallene fra 0 til 9 og lukker kanalen. Samtidig venter funktionen fetch_from_channel kl
x, flag := <- ch og nรฅr dataene bliver tilgรฆngelige, udskriver den dataene. Den afsluttes, nรฅr flaget er falsk, hvilket betyder, at kanalen er lukket.
Ventetiden i main() er givet for at forhindre, at main() forlades, indtil goroutinerne afslutter udfรธrelsen.
Udfรธr koden og se output som
Read data Send data 0 1 2 3 4 5 6 7 8 9 Empty channel Inside main()
Type
Select kan ses som en switch-erklรฆring, der fungerer pรฅ kanaler. Her vil sagsfremstillingerne vรฆre en kanaloperation. Normalt vil hver case-udsagn blive lรฆst forsรธg fra kanalen. Nรฅr nogen af โโsagerne er klar (kanalen lรฆses), udfรธres den erklรฆring, der er knyttet til sagen. Hvis flere sager er klar, vil den vรฆlge en tilfรฆldig. Du kan have en standardsag, som udfรธres, hvis ingen af โโsagerne er klar.
Lad os se nedenstรฅende kode
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)
}
}
Udfรธrelse af ovenstรฅende program vil give output:
from data2()
Her venter select-erklรฆringen pรฅ, at data er tilgรฆngelige i nogen af โโkanalerne. Data2() tilfรธjer data til kanalen efter en dvale pรฅ 2 sekunder, hvilket vil fรฅ det andet tilfรฆlde til at udfรธres.
Tilfรธj en standard case til valget i det samme program og se outputtet. Her, nรฅr den valgte blok er nรฅet, hvis ingen sag har data klar pรฅ kanalen, vil den udfรธre standardblokken uden at vente pรฅ, at data er tilgรฆngelige pรฅ nogen kanal.
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")
}
}
Dette program vil give output:
Default case executed
Dette skyldes, at nรฅr den valgte blok nรฅede, havde ingen kanal data til lรฆsning. Sรฅ standardsagen udfรธres.
mutex
Mutex er den korte form for gensidig udelukkelse. Mutex bruges, nรฅr du ikke รธnsker at tillade, at en ressource skal tilgรฅs af flere underrutiner pรฅ samme tid. Mutex har 2 metoder - Lรฅs og Lรฅs op. Mutex er indeholdt i sync-pakken. Sรฅ du skal importere synkroniseringspakken. Udsagn, der skal udfรธres gensidigt, kan placeres i mutex.Lock() og mutex.Unlock().
Lad os lรฆre mutex med et eksempel, der tรฆller antallet af gange, en loop udfรธres. I dette program forventer vi, at rutinen kรธrer loop 10 gange, og tรฆllingen er gemt i sum. Du kalder denne rutine 3 gange, sรฅ det samlede antal skal vรฆre 30. Optรฆllingen er gemt i en global variabel optรฆlling.
Fรธrst kรธrer du programmet uden mutex
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)
}
Se resultatet
Count after i=1 Count: 11 Count after i=3 Count: 12 Count after i=2 Count: 13 Final Count: 13
Resultatet kan vรฆre anderledes, nรฅr du udfรธrer det, men det endelige resultat vil ikke vรฆre 30.
Her, hvad der sker, er 3 goroutiner, der forsรธger at รธge slรธjfeantallet, der er gemt i det variable antal. Antag, at tallet pรฅ et tidspunkt er 5, og goroutine1 vil รธge tallet til 6. De vigtigste trin omfatter
Kopier tรฆller til temp
รg temp
Gem temperaturen tilbage for at tรฆlle
Antag kort efter at have udfรธrt trin 3 ved goroutine1; en anden goroutine kan have en gammel vรฆrdi, f.eks. 3 udfรธrer ovenstรฅende trin og gemmer 4 tilbage, hvilket er forkert. Dette kan forhindres ved at bruge mutex, som fรฅr andre rutiner til at vente, nรฅr en rutine allerede bruger variablen.
Nu vil du kรธre programmet med mutex. Her udfรธres de ovennรฆvnte 3 trin i en mutex.
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)
}
Nu bliver outputtet
Count after i=3 Count: 21 Count after i=2 Count: 28 Count after i=1 Count: 30 Final Count: 30
Her fรฅr vi det forventede resultat som endeligt output. Fordi udsagn lรฆsning, stigning og tilbageskrivning af optรฆlling udfรธres i en mutex.
Fejl ved hรฅndtering
Fejl er unormale forhold som at lukke en fil, der ikke er รฅbnet, รฅbne en fil, der ikke eksisterer, osv. Funktioner returnerer normalt fejl som den sidste returvรฆrdi.
Nedenstรฅende eksempel forklarer mere om fejlen.
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")
}
Outputtet vil vรฆre:
open /invalid.txt: no such file or directory
Her forsรธgte vi at รฅbne en ikke-eksisterende fil, og den returnerede fejlen til er variabel. Hvis filen er gyldig, vil fejlen vรฆre nul
Brugerdefinerede fejl
Ved at bruge denne funktion kan du oprette brugerdefinerede fejl. Dette gรธres ved at bruge New() i fejlpakken. Vi vil omskrive ovenstรฅende program for at gรธre brug af brugerdefinerede fejl.
Kรธr nedenstรฅende program
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)
}
}
Outputtet vil vรฆre:
Custom error message:File name is wrong
Her returnerer arealet () arealet af et kvadrat. Hvis input er mindre end 1, returnerer area() en fejlmeddelelse.
Lรฆsning af filer
Filer bruges til at gemme data. Go giver os mulighed for at lรฆse data fra filerne
Opret fรธrst en fil, data.txt, i din nuvรฆrende mappe med nedenstรฅende indhold.
Line one Line two Line three
Kรธr nu nedenstรฅende program for at se, at det udskriver indholdet af hele filen som output
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))
}
Her lรฆser dataene, err := ioutil.ReadFile(โdata.txtโ) dataene og returnerer en bytesekvens. Under udskrivning konverteres den til strengformat.
Skrivning af filer
Du vil se dette med et program
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
}
}
Her oprettes en fil, test.txt. Hvis filen allerede eksisterer, afkortes indholdet af filen. Writeline() bruges til at skrive indholdet til filen. Derefter lukkede du filen ved hjรฆlp af Close().
Cheat Sheet
I denne Go-tutorial dรฆkkede vi,
| Emne | Beskrivelse | Syntaks |
|---|---|---|
| Grundlรฆggende typer | Numerisk, streng, bool | |
| Variabler | Erklรฆre og tildele vรฆrdier til variabler | var variabel_navn type var variabelnavn type = vรฆrdi var variabel_navn1, variabel_navn2 = vรฆrdi1, vรฆrdi2 variabelnavn := vรฆrdi |
| Konstanter | Variabler, hvis vรฆrdi ikke kan รฆndres, nรฅr de fรธrst er tildelt | const variabel = vรฆrdi |
| Til Loop | Udfรธr sรฆtninger i en lรธkke. | for initialiseringsudtryk; evaluation_expression; iteration_expression{ // en eller flere udsagn } |
| Hvis ellers | Det er en betinget erklรฆring | hvis betingelse{ // udsagn_1 Else {} // udsagn_2 } |
| skifte | Betinget erklรฆring med flere sager | skifte udtryk { case value_1: udsagn_1 case value_2: udsagn_2 case value_n: udsagn_n Standard: statements_default } |
| Array | Fast stรธrrelse navngivet sekvens af elementer af samme type | matrixnavn := [stรธrrelse] type {vรฆrdi_0, vรฆrdi_1,..., vรฆrdi_stรธrrelse-1} |
| Slice | Del eller segment af et array | var slice_name [] type = array_name[start:slut] |
| Funktioner | Blok af udsagn, der udfรธrer en bestemt opgave | func funktionsnavn(parameter_1 type, parameter_n type) return_type { //udsagn } |
| Pakker | Bruges til at organisere koden. รger kodelรฆsbarhed og genbrugbarhed | importer pakke_nam |
| Udsรฆtte | Udsรฆtter udfรธrelsen af โโen funktion, indtil den indeholdende funktion afslutter udfรธrelsen | udskyde funktionsnavn (parameterliste) |
| Pointers | Gemmer hukommelsesadressen for en anden variabel. | var variabelnavn *type |
| Struktur | Brugerdefineret datatype, som i sig selv indeholder et element mere af samme eller anden type | skriv structname struct { variabel_1 variabel_1_type variabel_2 variabel_2_type variabel_n variabel_n_type } |
| Metoder | En metode er en funktion med et modtagerargument | func (variabel variabeltype) methodName(parameter_list) { } |
| Goroutine | En funktion, der kan kรธre samtidig med andre funktioner. | gรฅ funktionsnavn (parameterliste) |
| Kanal | Mรฅde for funktioner at kommunikere med hinanden. Et medie, hvor en rutine placerer data og tilgรฅs af en anden rutine. | Erklรฆre: ch := make(chan int) Send data til kanal: kanalvariabel <- variabel_navn Modtag fra kanal: variabel_navn := <- kanalvariabel |
| Type | Switch statement, der virker pรฅ kanaler. Sagsudtalelserne vil vรฆre en kanaloperation. Nรฅr en af โโkanalerne er klar med data, udfรธres den erklรฆring, der er knyttet til den pรฅgรฆldende sag | Vรฆlg { case x := <-chan1: fmt.Println(x) case y := <-chan2: fmt.Println(y) } |
| mutex | Mutex bruges, nรฅr du ikke รธnsker at tillade, at en ressource skal tilgรฅs af flere underrutiner pรฅ samme tid. Mutex har 2 metoder - Lรฅs og Lรฅs op | mutex.Lock() //udsagn mutex.Unlock(). |
| Lรฆs filer | Lรฆser dataene og returnerer en bytesekvens. | Data, fejl := ioutil.ReadFile(filnavn) |
| Skriv fil | Skriver data til en fil | l, fejl := f.WriteString(text_to_write) |
