Golang-handledning
Vad รคr Go?
Go (รคven kรคnt som Golang) รคr ett programmeringssprรฅk med รถppen kรคllkod som utvecklats av Google. Det รคr ett statiskt skrivet kompilerat sprรฅk. Go stรถder samtidig programmering, dvs det tillรฅter kรถrning av flera processer samtidigt. Detta uppnรฅs med hjรคlp av kanaler, goroutiner, etc. Go Language har skrรคpinsamling som sjรคlv skรถter minneshanteringen och tillรฅter uppskjuten exekvering av funktioner.
Vi kommer att lรคra oss alla grunderna i Golang i denna Learn Go Language Tutorial.
Hur man laddar ner och installerar GO
Steg 1) Gรฅ till https://golang.org/dl/. Ladda ner binรคren fรถr ditt operativsystem.
Steg 2) Double klicka pรฅ installationsprogrammet och klicka pรฅ Kรถr.
Steg 3) Klicka pรฅ Nรคsta

Steg 4) Vรคlj installationsmappen och klicka pรฅ Nรคsta.

Steg 5) Klicka pรฅ Slutfรถr nรคr installationen รคr klar.

Steg 6) Nรคr installationen รคr klar kan du verifiera den genom att รถppna terminalen och skriva
go version
Detta kommer att visa versionen av go installerad

Ditt First Go-program โ Go Hello World!
Skapa en mapp som heter studyGo. I den hรคr Go-sprรฅkhandledningen kommer vi att skapa vรฅra go-program i den hรคr mappen. Go-filer skapas med tillรคgget .gรฅ. Du kan kรถra Go-program med syntaxen
go run <filename>
Skapa en fil som heter first.go och lรคgg till koden nedan i den och spara
package main
import ("fmt")
func main() {
fmt.Println("Hello World! This is my first Go program\n")
}

Navigera till den hรคr mappen i din terminal. Kรถr programmet med kommandot
gรฅ springa fรถrst.gรฅ
Du kan se utskriften
Hello World! This is my first Go program

Lรฅt oss nu diskutera programmet ovan.
huvudpaket โ Varje Go Language-program bรถr bรถrja med ett paketnamn. Go tillรฅter oss att anvรคnda paket i andra go-program och stรถder dรคrfรถr รฅteranvรคndbarhet av kod. Kรถrning av ett Go-program bรถrjar med koden inuti paketet som heter main.
import fmt โ importerar paketet fmt. Detta paket implementerar I/O-funktionerna.
func main() โ Detta รคr funktionen frรฅn vilken programkรถrningen bรถrjar. Huvudfunktionen ska alltid placeras i huvudpaketet. Under main() kan du skriva koden inuti { }.
fmt.Println โ Detta kommer att skriva ut texten pรฅ skรคrmen med funktionen Println i fmt.
Obs: Nรคr du nรคmner kรถra/kรถr koden i avsnitten nedan i denna Go-handledning betyder det att spara koden i en fil med .go-tillรคgget och kรถra den med syntaxen
go run <filename>
Datatyper
Typer (datatyper) representerar typen av vรคrde som lagras i en variabel, typ av vรคrde en funktion returnerar, etc.
Det finns tre grundlรคggande typer i Go Language
Numeriska typer โ Representerar numeriska vรคrden som inkluderar heltal, flyttal och komplexa vรคrden. Olika numeriska typer รคr:
int8 โ 8 bitars signerade heltal.
int16 โ 16 bitars signerade heltal.
int32 โ 32 bitars signerade heltal.
int64 โ 64 bitars signerade heltal.
uint8 โ 8-bitars heltal utan tecken.
uint16 โ 16-bitars heltal utan tecken.
uint32 โ 32-bitars heltal utan tecken.
uint64 โ 64-bitars heltal utan tecken.
flytande 32 โ 32 bitars flyttal.
flytande 64 โ 64 bitars flyttal.
complex64 โ har float32 verkliga och imaginรคra delar.
complex128 โ har float32 verkliga och imaginรคra delar.
Strรคngtyper โ Representerar en sekvens av byte(tecken). Du kan gรถra olika operationer pรฅ strรคngar som strรคngsammansรคttning, extrahera delstrรคng, etc
booleska typer โ Representerar 2 vรคrden, antingen sant eller falskt.
Golang-grรคnssnitt
Golang-grรคnssnitt รคr en samling metodsignaturer som anvรคnds av en Type fรถr att implementera beteendet hos objekt. Huvudmรฅlet med Golang-grรคnssnittet รคr att tillhandahรฅlla metodsignaturer med namn, argument och returtyper. Det รคr upp till en typ att deklarera och implementera metoden. Ett grรคnssnitt i Golang kan deklareras med nyckelordet "grรคnssnitt".
variabler
Variabler pekar pรฅ en minnesplats som lagrar nรฅgot slags vรคrde. Typparametern (i syntaxen nedan) representerar den typ av vรคrde som kan lagras i minnesplatsen.
Variabel kan deklareras med hjรคlp av syntaxen
var <variable_name> <type>
Nรคr du deklarerar en variabel av en typ kan du tilldela variabeln till vilket vรคrde som helst av den typen.
Du kan ocksรฅ ge ett initialvรคrde till en variabel under sjรคlva deklarationen med hjรคlp av
var <variable_name> <type> = <value>
Om du deklarerar variabeln med ett initialt vรคrde, Go och hรคrleda typen av variabel frรฅn den typ av vรคrde som tilldelats. Sรฅ du kan utelรคmna typen under deklarationen med hjรคlp av syntaxen
var <variable_name> = <value>
Du kan ocksรฅ deklarera flera variabler med syntaxen
var <variable_name1>, <variable_name2> = <value1>, <value2>
Nedanstรฅende program i denna Go-handledning har nรฅgra Golang-exempel pรฅ variabeldeklarationer
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)
}
Resultatet blir
x: 3 y: 20 z: 50 i and j: 100 hello
Go Language ger ocksรฅ ett enkelt sรคtt att deklarera variablerna med vรคrde genom att utelรคmna nyckelordet var
<variable_name> := <value>
Observera att du anvรคnde := istรคllet fรถr =. Du kan inte anvรคnda := bara fรถr att tilldela ett vรคrde till en variabel som redan รคr deklarerad. := anvรคnds fรถr att deklarera och tilldela vรคrde.
Skapa en fil som heter assign.go med fรถljande kod
package main
import ("fmt")
func main() {
a := 20
fmt.Println(a)
//gives error since a is already declared
a := 30
fmt.Println(a)
}
Kรถr go run assign.go fรถr att se resultatet som
./assign.go:7:4: no new variables on left side of :=
Variabler som deklareras utan ett initialt vรคrde kommer att ha 0 fรถr numeriska typer, false fรถr booleska och tom strรคng fรถr strรคngar
Konstant
Konstanta variabler รคr de variabler vars vรคrde inte kan รคndras nรคr de vรคl har tilldelats. En konstant i Go programmeringssprรฅk deklareras genom att anvรคnda nyckelordet "const"
Skapa en fil som heter constant.go och med fรถljande kod
package main
import ("fmt")
func main() {
const b =10
fmt.Println(b)
b = 30
fmt.Println(b)
}
Kรถr go run constant.go fรถr att se resultatet som
.constant.go:7:4: cannot assign to b
Fรถr loopexempel
Slingor anvรคnds fรถr att exekvera ett block av satser upprepade gรฅnger baserat pรฅ ett villkor. De flesta av programmeringssprรฅken tillhandahรฅller 3 typer av loopar โ fรถr, medan, do while. Men programmeringssprรฅket Go stรถder endast fรถr loop.
Syntaxen fรถr en Golang fรถr loop รคr
for initialisation_expression; evaluation_expression; iteration_expression{
// one or more statement
}
Initialiseringsuttrycket exekveras fรถrst (och endast en gรฅng) i Golang for loop.
Sedan utvรคrderas evaluation_expression och om det รคr sant exekveras koden inuti blocket.
Iteration_expression id exekveras och evaluation_expression utvรคrderas igen. Om det รคr sant exekveras satsblocket igen. Detta kommer att fortsรคtta tills evaluation_expression blir falskt.
Kopiera programmet nedan till en fil och kรถr det fรถr att se Golang fรถr looputskriftsnummer frรฅn 1 till 5
package main
import "fmt"
func main() {
var i int
for i = 1; i <= 5; i++ {
fmt.Println(i)
}
}
Output รคr
1 2 3 4 5
Om annat
Om annat รคr ett villkorligt uttalande. Synaxen รคr
if condition{
// statements_1
}else{
// statements_2
}
Hรคr utvรคrderas villkoret och om det รคr sant kommer statements_1 att exekveras annars kommer statements_2 att exekveras.
Du kan anvรคnda if-satsen utan annat ocksรฅ. Du kan ocksรฅ ha kedjade if else-uttalanden. Nedanstรฅende program kommer att fรถrklara mer om annat.
Kรถr programmet nedan. Den kontrollerar om ett tal, x, รคr mindre รคn 10. Om sรฅ รคr fallet kommer det att skriva ut "x รคr mindre รคn 10"
package main
import "fmt"
func main() {
var x = 50
if x < 10 {
//Executes if x < 10
fmt.Println("x is less than 10")
}
}
Eftersom vรคrdet pรฅ x hรคr รคr stรถrre รคn 10 kommer inte satsen inuti if-blocket att kรถras.
Se nu programmet nedan. I den hรคr guiden fรถr programmeringssprรฅket Go har vi ett annat block som kommer att kรถras om utvรคrderingen misslyckas.
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")
}
}
Detta program kommer att ge dig utdata
x is greater than or equals 10
Nu i denna Go-handledning kommer vi att se ett program med flera if else-block (kedjade om annat). Utfรถr Go-exemplet nedan. Den kontrollerar om ett tal รคr mindre รคn 10 eller รคr mellan 10-90 eller stรถrre รคn 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")
}
}
Hรคr kontrollerar fรถrst if-villkoret om x รคr mindre รคn 10 och inte. Sรฅ det kontrollerar nรคsta villkor (annat om) om det รคr mellan 10 och 90, vilket ocksรฅ รคr falskt. Sรฅ den exekverar sedan blocket under else-sektionen som ger utdata
x is greater than 90
Vรคxla
Switch รคr ett annat villkorligt uttalande. Switch-satser utvรคrderar ett uttryck och resultatet jรคmfรถrs med en uppsรคttning tillgรคngliga vรคrden (fall). Nรคr en matchning har hittats exekveras uttalanden som รคr associerade med matchningen (casefallet). Om ingen matchning hittas kommer ingenting att exekveras. Du kan ocksรฅ lรคgga till ett standardfall fรถr vรคxling som kommer att kรถras om inga andra matchningar hittas. Syntaxen fรถr switchen รคr
switch expression {
case value_1:
statements_1
case value_2:
statements_2
case value_n:
statements_n
default:
statements_default
}
Hรคr jรคmfรถrs uttryckets vรคrde mot vรคrdena i varje enskilt fall. Nรคr en matchning har hittats exekveras de uttalanden som รคr associerade med det fallet. Om ingen matchning hittas exekveras satserna under standardavsnittet.
Kรถr programmet nedan
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 kommer att fรฅ utdata som
Sum is 3
รndra vรคrdet pรฅ a och b till 3 sรฅ blir resultatet
Printing default
Du kan ocksรฅ ha flera vรคrden i ett fall genom att separera dem med ett kommatecken.
arrayer
Array representerar en fast storlek, namngiven sekvens av element av samma typ. Du kan inte ha en array som innehรฅller bรฅde heltal och tecken. Du kan inte รคndra storleken pรฅ en array nรคr du vรคl har definierat storleken.
Syntaxen fรถr att deklarera en array รคr
var arrayname [size] type
Varje matriselement kan tilldelas vรคrde med hjรคlp av syntaxen
arrayname [index] = value
Arrayindex bรถrjar frรฅn 0 till storlek-1.
Du kan tilldela vรคrden till matriselement under deklarationen med hjรคlp av syntaxen
arrayname := [size] type {value_0,value_1,โฆ,value_size-1}
Du kan ocksรฅ ignorera storleksparametern medan du deklarerar arrayen med vรคrden genom att ersรคtta storlek med . och kompilatorn kommer att hitta lรคngden frรฅn antalet vรคrden. Syntax รคr
arrayname := [โฆ] type {value_0,value_1,โฆ,value_size-1}
Du kan hitta lรคngden pรฅ arrayen genom att anvรคnda syntaxen
len(arrayname)
Utfรถr Go-exemplet nedan fรถr att fรถrstรฅ arrayen
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 skiva รคr en del eller ett segment av en array. Eller sรฅ รคr det en vy eller en delvy av en underliggande array som den pekar pรฅ. Du kan komma รฅt elementen i en skiva med hjรคlp av skivans namn och indexnummer precis som du gรถr i en array. Du kan inte รคndra lรคngden pรฅ en array, men du kan รคndra storleken pรฅ en skiva.
Innehรฅllet i en skiva รคr faktiskt pekarna till elementen i en array. Det betyder om du รคndrar nรฅgot element i en skiva kommer det underliggande arrayinnehรฅllet ocksรฅ att pรฅverkas.
Syntaxen fรถr att skapa ett segment รคr
var slice_name [] type = array_name[start:end]
Detta kommer att skapa en skiva som heter slice_name frรฅn en array som heter array_name med elementen i indexet frรฅn bรถrjan till slut-1.
Nu i denna Golang-handledning kommer vi att kรถra programmet nedan. Programmet kommer att skapa en skiva frรฅn arrayen och skriva ut den. Du kan ocksรฅ se att รคndring av innehรฅllet i segmentet kommer att รคndra den faktiska arrayen.
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)
}
Detta kommer att skriva ut 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]
Det finns vissa funktioner som Golang len, Golang append som du kan anvรคnda pรฅ skivor
len(slice_name) โ returnerar lรคngden pรฅ skivan
append(slice_name, value_1, value_2) โ Golang append anvรคnds fรถr att lรคgga till value_1 och value_2 till ett befintligt segment.
append(slice_nale1,slice_name2...) โ lรคgger till skivnamn2 till skivnamn1
Kรถr fรถljande 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)
}
Resultatet blir
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 skapar fรถrst 2 skivor och skrev ut dess lรคngd. Sedan satte den en skiva till en annan och satte sedan en strรคng till den resulterande skivan.
Funktioner
En funktion representerar ett block av satser som utfรถr en specifik uppgift. En funktionsdeklaration berรคttar fรถr oss funktionsnamn, returtyp och indataparametrar. Funktionsdefinition representerar koden som finns i funktionen. Syntaxen fรถr att deklarera funktionen รคr
func function_name(parameter_1 type, parameter_n type) return_type {
//statements
}
Parametrarna och returtyperna รคr valfria. Du kan ocksรฅ returnera flera vรคrden frรฅn en funktion.
Nu i denna Golang-handledning, lรฅt oss kรถra fรถljande Golang-exempel. Funktionen calc hรคr accepterar 2 tal och utfรถr addition och subtraktion och returnerar bรฅda vรคrdena.
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)
}
Resultatet blir
Sum 25 Diff 5
Paket
Paket anvรคnds fรถr att organisera koden. I ett stort projekt รคr det inte mรถjligt att skriva kod i en enda fil. Go programmeringssprรฅk lรฅter oss organisera koden under olika paket. Detta รถkar kodlรคsbarheten och รฅteranvรคndbarheten. Ett kรถrbart Go-program bรถr innehรฅlla ett paket med namnet main och programkรถrningen startar frรฅn funktionen som heter main. Du kan importera andra paket i vรฅrt program med hjรคlp av syntaxen
import package_name
Vi kommer att se och diskutera i denna Golang-handledning, hur man skapar och anvรคnder paket i fรถljande Golang-exempel.
Steg 1) Skapa en fil som heter package_example.go och lรคgg till koden nedan
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 programmet ovan finns fmt ett paket som Go-programmeringssprรฅket tillhandahรฅller oss frรคmst fรถr I/O-รคndamรฅl. Du kan ocksรฅ se ett paket som heter berรคkning. Inuti main() kan du se en stegsumma := berรคkning.Do_add(x,y). Det betyder att du anropar funktionen Do_add frรฅn paketberรคkning.
Steg 2) Fรถrst bรถr du skapa paketberรคkningen i en mapp med samma namn under src-mappen pรฅ vรคgen. Den installerade sรถkvรคgen fรถr go kan hittas frรฅn PATH-variabeln.
Fรถr mac, hitta sรถkvรคgen genom att kรถra echo $PATH

Sรฅ sรถkvรคgen รคr /usr/local/go
Fรถr Windows, hitta sรถkvรคgen genom att kรถra echo %GOROOT%

Hรคr รคr sรถkvรคgen C:\Go\
Steg 3) Navigera till mappen src (/usr/local/go/src fรถr mac och C:\Go\src fรถr Windows). Nu frรฅn koden รคr paketnamnet berรคkning. Go krรคver att paketet ska placeras i en katalog med samma namn under src-katalogen. Skapa en katalog som heter berรคkning i src-mappen.
Steg 4) Skapa en fil som heter calc.go (Du kan ge vilket namn som helst, men paketnamnet i koden spelar roll. Hรคr ska det vara berรคkning) i berรคkningskatalogen och lรคgg till koden nedan
package calculation
func Do_add(num1 int, num2 int)(int) {
sum := num1 + num2
return sum
}
Steg 5) Kรถr kommandot go install frรฅn berรคkningskatalogen som kommer att kompilera calc.go.

Steg 6) Gรฅ nu tillbaka till package_example.go och kรถr go run package_example.go. Utgรฅngen blir summa 25.
Observera att namnet pรฅ funktionen Do_add bรถrjar med en stor bokstav. Detta beror pรฅ att i Go om funktionsnamnet bรถrjar med en stor bokstav betyder det att andra program kan se (รฅtkomst) det annars kan andra program inte komma รฅt det. Om funktionsnamnet var do_add , skulle du ha fรฅtt felet
kan inte referera till oexporterad namnberรคkning.berรคkning.
Defer och stapling defers
Defer-satser anvรคnds fรถr att skjuta upp exekveringen av ett funktionsanrop tills funktionen som innehรฅller defer-satsen slutfรถr exekveringen.
Lรฅt oss lรคra oss detta med ett exempel:
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()")
}
Resultatet blir
Inside the main() Inside the sample()
Hรคr skjuts exekveringen av sample() upp tills exekveringen av den omslutande funktionen(main()) รคr klar.
Stacking defer anvรคnder flera defer-satser. Anta att du har flera defer-satser i en funktion. Go placerar alla uppskjutna funktionsanrop i en stack, och nรคr den omslutande funktionen รฅtervรคnder, exekveras de staplade funktionerna i Last In First Out (LIFO) order. Du kan se detta i exemplet nedan.
Kรถr koden nedan
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)
}
Resultatet blir
4 3 2 1
Hรคr exekveras fรถrst koden inuti main() och sedan exekveras de uppskjutna funktionsanropen i omvรคnd ordning, dvs 4, 3,2,1.
Pekare
Innan vi fรถrklarar tips, lรฅt oss fรถrst diskutera '&'-operatorn. Operatorn '&' anvรคnds fรถr att fรฅ adressen till en variabel. Det betyder att '&a' kommer att skriva ut minnesadressen fรถr variabel a.
I den hรคr Golang-handledningen kommer vi att kรถra programmet nedan fรถr att visa vรคrdet pรฅ en variabel och adressen till den variabeln
package main
import "fmt"
func main() {
a := 20
fmt.Println("Address:",&a)
fmt.Println("Value:",a)
}
Resultatet blir
Address: 0xc000078008 Value: 20
En pekarvariabel lagrar minnesadressen fรถr en annan variabel. Du kan definiera en pekare med hjรคlp av syntaxen
var variable_name *type
Asterisken(*) representerar variabeln รคr en pekare. Du kommer att fรถrstรฅ mer genom att kรถra programmet nedan
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)}
Resultatet blir
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 รคr en anvรคndardefinierad datatyp som i sig innehรฅller ytterligare ett element av samma eller annan typ.
Att anvรคnda en struktur รคr en process i tvรฅ steg.
Skapa (deklarera) fรถrst en strukturtyp
Fรถr det andra, skapa variabler av den typen fรถr att lagra vรคrden.
Strukturer anvรคnds frรคmst nรคr du vill lagra relaterad data tillsammans.
Tรคnk pรฅ en del av anstรคlld information som har namn, รฅlder och adress. Du kan hantera detta pรฅ 2 sรคtt
Skapa 3 arrayer โ en array lagrar namnen pรฅ anstรคllda, en lagrar รฅlder och den tredje lagrar รฅlder.
Deklarera en strukturtyp med 3 fรคlt-namn, adress och รฅlder. Skapa en array av den strukturtypen dรคr varje element รคr ett strukturobjekt med namn, adress och รฅlder.
Det fรถrsta tillvรคgagรฅngssรคttet รคr inte effektivt. I den hรคr typen av scenarier รคr strukturer mer bekvรคma.
Syntaxen fรถr att deklarera en struktur รคr
type structname struct {
variable_1 variable_1_type
variable_2 variable_2_type
variable_n variable_n_type
}
Ett exempel pรฅ en strukturdeklaration รคr
type emp struct {
name string
address string
age int
}
Hรคr skapas en ny anvรคndardefinierad typ som heter emp. Nu kan du skapa variabler av typen emp med hjรคlp av syntaxen
var variable_name struct_name
Ett exempel รคr
var empdata1 emp
Du kan stรคlla in vรคrden fรถr empdata1 som
empdata1.name = "John" empdata1.address = "Street-1, Bangalore" empdata1.age = 30
Du kan ocksรฅ skapa en strukturvariabel och tilldela vรคrden genom
empdata2 := emp{"Raj", "Building-1, Delhi", 25}
Hรคr mรฅste du behรฅlla ordningen pรฅ elementen. Raj kommer att mappas till namn, nรคsta element till adress och det sista att รฅldras.
Kรถr koden nedan
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 (inte funktioner)
En metod รคr en funktion med ett mottagarargument. Archirent tekniskt stรฅr det mellan nyckelordet func och metodnamnet. Syntaxen fรถr en metod รคr
func (variable variabletype) methodName(parameter1 paramether1type) {
}
Lรฅt oss konvertera ovanstรฅende exempelprogram till att anvรคnda metoder istรคllet fรถr 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 รคr inte ett objektorienterat sprรฅk och det har inte begreppet klass. Metoder ger en kรคnsla av vad du gรถr i objektorienterade program dรคr funktionerna i en klass anropas med hjรคlp av syntaxen objektnamn.funktionsnamn()
samtidighet
Go stรถder samtidig utfรถrande av uppgifter. Det betyder att Go kan utfรถra flera uppgifter samtidigt. Det skiljer sig frรฅn begreppet parallellism. I parallellism delas en uppgift upp i smรฅ deluppgifter och utfรถrs parallellt. Men samtidigt utfรถrs flera uppgifter samtidigt. Samtidighet uppnรฅs i Go med Goroutines och Channels.
Goroutiner
En goroutin รคr en funktion som kan kรถras samtidigt med andra funktioner. Vanligtvis nรคr en funktion anropas รถverfรถrs kontrollen till den anropade funktionen, och nรคr dess slutfรถrda exekveringskontroll รฅtergรฅr till den anropande funktionen. Den anropande funktionen fortsรคtter sedan att utfรถras. Den anropande funktionen vรคntar pรฅ att den anropade funktionen slutfรถr exekveringen innan den fortsรคtter med resten av satserna.
Men i fallet med goroutine, kommer den anropande funktionen inte att vรคnta pรฅ att exekveringen av den anropade funktionen ska slutfรถras. Det kommer att fortsรคtta att kรถras med nรคsta uttalanden. Du kan ha flera goroutiner i ett program.
Dessutom kommer huvudprogrammet att avslutas nรคr det slutfรถrt exekveringen av sina uttalanden och det kommer inte att vรคnta pรฅ slutfรถrandet av de anropade goroutinerna.
Goroutine anropas med nyckelordet go fรถljt av ett funktionsanrop.
Exempelvis
go add(x,y)
Du kommer att fรถrstรฅ goroutiner med Golang-exemplen nedan. Kรถr programmet nedan
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")
}
}
Resultatet blir
In main In main In main In main In main
Hรคr avslutade huvudprogrammet exekveringen redan innan goroutinen startade. Display() รคr en goroutin som anropas med hjรคlp av syntaxen
go function_name(parameter list)
I ovanstรฅende kod vรคntar main() inte pรฅ att display() ska slutfรถras, och main() slutfรถrde sin kรถrning innan display() exekverade sin kod. Sรฅ print-satsen inuti display() skrivs inte ut.
Nu modifierar vi programmet fรถr att รคven skriva ut satserna frรฅn display(). Vi lรคgger till en tidsfรถrdrรถjning pรฅ 2 sek i for-slingan i main() och en 1 sek fรถrdrรถjning i for-slingan 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")
}
}
Utgรฅngen kommer att vara nรฅgot liknande
In display In main In display In display In main In display In display In main In main In main
Hรคr kan du se att bรฅda looparna exekveras pรฅ ett รถverlappande sรคtt pรฅ grund av den samtidiga exekveringen.
Kanaler
Kanaler รคr ett sรคtt fรถr funktioner att kommunicera med varandra. Det kan ses som ett medium dรคr en rutin placerar data och nรฅs av en annan rutin i Golang-servern.
En kanal kan deklareras med syntaxen
channel_variable := make(chan datatype)
Exempelvis:
ch := make(chan int)
Du kan skicka data till en kanal med hjรคlp av syntaxen
channel_variable <- variable_name
Exempelvis
ch <- x
Du kan ta emot data frรฅn en kanal med hjรคlp av syntaxen
variable_name := <- channel_variable
Exempelvis
y := <- ch
I ovanstรฅende Go-sprรฅkexempel pรฅ goroutine har du sett att huvudprogrammet inte vรคntar pรฅ goroutinen. Men sรฅ รคr det inte nรคr kanaler รคr inblandade. Anta att om en goroutin skjuter data till kanal, kommer main() att vรคnta pรฅ satsen som tar emot kanaldata tills den fรฅr data.
Du kommer att se detta i exempel pรฅ Go-sprรฅk nedan. Skriv fรถrst en normal goroutin och se beteendet. รndra sedan programmet fรถr att anvรคnda kanaler och se beteendet.
Kรถr programmet nedan
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()")
}
Resultatet blir
Inside main()
Main() avslutade exekveringen och avslutade innan goroutinen kรถrdes. Sรฅ utskriften inuti display() kรถrdes inte.
รndra nu programmet ovan fรถr att anvรคnda kanaler och se beteendet.
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)
}
Resultatet blir
Inside display() Inside main() Printing x in main() after taking from channel: 1234
Hรคr vad som hรคnder รคr main() nรคr man nรฅr x := <-ch vรคntar pรฅ data pรฅ kanal ch. Displayen() har en vรคntetid pรฅ 5 sekunder och skickar sedan data till kanalen ch. Main() fรถr att ta emot data frรฅn kanalen avblockeras och fortsรคtter dess exekvering.
Avsรคndaren som skickar data till kanalen kan informera mottagarna att ingen mer data kommer att lรคggas till kanalen genom att stรคnga kanalen. Detta anvรคnds frรคmst nรคr du anvรคnder en loop fรถr att skicka data till en kanal. En kanal kan stรคngas med
close(channel_name)
Och i mottagarรคnden รคr det mรถjligt att kontrollera om kanalen รคr stรคngd med hjรคlp av en extra variabel medan data hรคmtas frรฅn kanalen med
variable_name, status := <- channel_variable
Om statusen รคr True betyder det att du fรฅtt data frรฅn kanalen. Om falskt betyder det att du fรถrsรถker lรคsa frรฅn en stรคngd kanal
Du kan ocksรฅ anvรคnda kanaler fรถr kommunikation mellan goroutiner. Behรถver anvรคnda 2 goroutiner โ en skickar data till kanalen och andra tar emot data frรฅn kanalen. Se programmet nedan
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()")
}
Hรคr finns det 2 subrutiner en skjuter data till kanalen och andra skriver ut data till kanalen. Funktionen add_to_channel adderar siffrorna frรฅn 0 till 9 och stรคnger kanalen. Samtidigt vรคntar funktionen hรคmta_frรฅn_kanal kl
x, flagga := <- ch och nรคr data blir tillgรคngliga skrivs data ut. Den avslutas nรคr flaggan รคr falsk vilket betyder att kanalen รคr stรคngd.
Vรคntan i main() ges fรถr att fรถrhindra att main() lรคmnas tills goroutinerna avslutar exekveringen.
Kรถr koden och se utdata som
Read data Send data 0 1 2 3 4 5 6 7 8 9 Empty channel Inside main()
Vรคlja
Select kan ses som en switch-sats som fungerar pรฅ kanaler. Hรคr kommer fallutlรฅtandena att vara en kanaloperation. Vanligtvis kommer varje fall uttalanden att lรคsas fรถrsรถk frรฅn kanalen. Nรคr nรฅgot av fallen รคr klart (kanalen lรคses) exekveras uttalandet som รคr associerat med det รคrendet. Om flera fall รคr klara kommer den att vรคlja ett slumpmรคssigt. Du kan ha ett standardfall som kรถrs om inget av fallen รคr klart.
Lรฅt oss se koden nedan
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)
}
}
Att kรถra programmet ovan ger resultatet:
from data2()
Hรคr vรคntar select-satsen pรฅ att data ska vara tillgรคnglig i nรฅgon av kanalerna. Data2() lรคgger till data till kanalen efter en sรถmn pรฅ 2 sekunder vilket gรถr att det andra fallet kรถrs.
Lรคgg till ett standardfall till markeringen i samma program och se resultatet. Hรคr, nรคr det vรคljs block, om inget fall har data redo pรฅ kanalen, kommer det att exekvera standardblocket utan att vรคnta pรฅ att data ska vara tillgรคnglig pรฅ nรฅgon 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")
}
}
Detta program kommer att ge resultatet:
Default case executed
Detta beror pรฅ att nรคr valblocket nรฅdde hade ingen kanal data fรถr lรคsning. Sรฅ standardfallet exekveras.
mutex
Mutex รคr kortformen fรถr รถmsesidig uteslutning. Mutex anvรคnds nรคr du inte vill tillรฅta att en resurs ska nรฅs av flera subrutiner samtidigt. Mutex har 2 metoder - Lรฅs och Lรฅs upp. Mutex finns i sync-paketet. Sรฅ du mรฅste importera synkroniseringspaketet. De satser som mรฅste utfรถras รถmsesidigt uteslutande kan placeras inuti mutex.Lock() och mutex.Unlock().
Lรฅt oss lรคra oss mutex med ett exempel som rรคknar antalet gรฅnger en loop exekveras. I det hรคr programmet fรถrvรคntar vi oss att rutinen kรถrs loop 10 gรฅnger och rรคkningen lagras i summa. Du anropar denna rutin 3 gรฅnger sรฅ det totala antalet bรถr vara 30. Antalet lagras i en global variabelrรคkning.
Fรถrst kรถr du programmet utan 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 bli annorlunda nรคr du kรถr det men slutresultatet blir inte 30.
Det som hรคnder hรคr รคr att 3 goroutiner fรถrsรถker รถka antalet loopar som lagras i det variabla antalet. Anta att antalet vid ett รถgonblick รคr 5 och goroutine1 kommer att รถka antalet till 6. Huvudstegen inkluderar
Kopiera rรคkna till temp
รka temp
Spara temperaturen tillbaka fรถr att rรคkna
Antag att strax efter att ha utfรถrt steg 3 av goroutine1; en annan goroutin kan ha ett gammalt vรคrde, sรคg att 3 gรถr ovanstรฅende steg och lagrar 4 tillbaka, vilket รคr fel. Detta kan fรถrhindras genom att anvรคnda mutex som gรถr att andra rutiner vรคntar nรคr en rutin redan anvรคnder variabeln.
Nu kommer du att kรถra programmet med mutex. Hรคr exekveras de ovan nรคmnda 3 stegen 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 blir utgรฅngen
Count after i=3 Count: 21 Count after i=2 Count: 28 Count after i=1 Count: 30 Final Count: 30
Hรคr fรฅr vi det fรถrvรคntade resultatet som slutresultat. Eftersom uttalandena lรคser, inkrementerar och skriver tillbaka rรคkningen utfรถrs i en mutex.
Felhantering
Fel รคr onormala tillstรฅnd som att stรคnga en fil som inte รคr รถppen, รถppna en fil som inte finns, etc. Funktioner returnerar vanligtvis fel som det sista returvรคrdet.
Exemplet nedan fรถrklarar mer om felet.
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")
}
Utgรฅngen kommer att vara:
open /invalid.txt: no such file or directory
Hรคr fรถrsรถkte vi รถppna en icke-existerande fil, och den returnerade felet till er variabel. Om filen รคr giltig kommer felet att vara null
Anpassade fel
Med den hรคr funktionen kan du skapa anpassade fel. Detta gรถrs genom att anvรคnda New() av โโfelpaketet. Vi kommer att skriva om programmet ovan fรถr att anvรคnda anpassade fel.
Kรถr programmet nedan
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)
}
}
Utgรฅngen kommer att vara:
Custom error message:File name is wrong
Hรคr returnerar area() arean av en kvadrat. Om inmatningen รคr mindre รคn 1 returnerar area() ett felmeddelande.
Lรคser filer
Filer anvรคnds fรถr att lagra data. Go lรฅter oss lรคsa data frรฅn filerna
Skapa fรถrst en fil, data.txt, i din nuvarande katalog med innehรฅllet nedan.
Line one Line two Line three
Kรถr nu programmet nedan fรถr att se att det skriver ut innehรฅllet i hela filen som utdata
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))
}
Hรคr lรคser data, err := ioutil.ReadFile(โdata.txtโ) data och returnerar en bytesekvens. Under utskrift konverteras den till strรคngformat.
Skriver filer
Du kommer att se detta med ett 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
}
}
Hรคr skapas en fil, test.txt. Om filen redan finns trunkeras innehรฅllet i filen. Writeline() anvรคnds fรถr att skriva innehรฅllet till filen. Efter det stรคngde du filen med Close().
Fusklapp
I denna Go-handledning tรคckte vi,
| รmne | BESKRIVNING | syntax |
|---|---|---|
| Grundtyper | Numerisk, strรคng, bool | |
| variabler | Deklarera och tilldela vรคrden till variabler | var variabelnamn typ var variabelnamn typ = vรคrde var variabelnamn1, variabelnamn2 = vรคrde1, vรคrde2 variabelnamn := vรคrde |
| Konstant | Variabler vars vรคrde inte kan รคndras nรคr de vรคl har tilldelats | const variabel = vรคrde |
| Fรถr Loop | Kรถr uttalanden i en loop. | fรถr initialiseringsuttryck; evaluation_expression; iteration_expression{ // ett eller flera uttalanden } |
| Om annat | Det รคr ett villkorligt uttalande | om skick{ // uttalanden_1 } Else { // uttalanden_2 } |
| strรถmbrytare | Villkorligt uttalande med flera fall | switch expression { case value_1: uttalanden_1 case value_2: uttalanden_2 case value_n: uttalanden_n default: statements_default } |
| array | Fast storlek med namnet sekvens av element av samma typ | arrayname := [size] typ {value_0,value_1,...,value_size-1} |
| Skiva | Del eller segment av en array | var slice_name [] typ = array_name[start:slut] |
| Funktioner | Block av uttalanden som utfรถr en specifik uppgift | func function_name(parameter_1 typ, parameter_n type) return_type { //pรฅstรฅenden } |
| Paket | Anvรคnds fรถr att organisera koden. รkar kodlรคsbarhet och รฅteranvรคndbarhet | importera paket_nam |
| Skjut upp | Drรถjer upp exekveringen av en funktion tills den innehรฅllande funktionen avslutar exekveringen | defer function_name (parameter_list) |
| Pekare | Lagrar minnesadressen fรถr en annan variabel. | var variabelnamn *typ |
| Structure | Anvรคndardefinierad datatyp som i sig innehรฅller ytterligare ett element av samma eller annan typ | typ structname struct { variabel_1 variabel_1_typ variabel_2 variabel_2_typ variabel_n variabel_n_typ } |
| Metoder | En metod รคr en funktion med ett mottagarargument | func (variabel variabeltyp) methodName(parameter_list) { } |
| Goroutine | En funktion som kan kรถras samtidigt med andra funktioner. | gรฅ funktionsnamn(parameterlista) |
| Kanal | Sรคtt fรถr funktioner att kommunicera med varandra. Ett medium till vilket en rutin placerar data och nรฅs av en annan rutin. | Fรถrklara: ch := make(chan int) Skicka data till kanal: kanalvariabel <- variabelnamn Ta emot frรฅn kanal: variabelnamn := <- kanalvariabel |
| Vรคlja | Switch statement som fungerar pรฅ kanaler. Fallutlรฅtandena kommer att vara en kanaloperation. Nรคr nรฅgon av kanalerna รคr redo med data, exekveras uttalandet som รคr associerat med det fallet | Vรคlj { fall x := <-chan1: fmt.Println(x) fall y := <-chan2: fmt.Println(y) } |
| mutex | Mutex anvรคnds nรคr du inte vill tillรฅta att en resurs ska nรฅs av flera subrutiner samtidigt. Mutex har 2 metoder - Lรฅs och Lรฅs upp | mutex.Lock() //pรฅstรฅenden mutex.Unlock(). |
| Lรคs filer | Lรคser data och returnerar en bytesekvens. | Data, fel := ioutil.ReadFile(filnamn) |
| Skriv fil | Skriver data till en fil | l, fel := f.WriteString(text_to_write) |
