table of contents pemrograman golang.pdf · fungsi fungsi multiple return fungsi variadic fungsi...
TRANSCRIPT
-
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
1.9
1.10
1.11
1.12
1.13
1.14
1.15
1.16
1.17
1.18
1.19
1.20
1.21
1.22
1.23
1.24
1.25
1.26
1.27
1.28
1.29
1.30
TableofContentsIntroduction
BerkenalanDenganGolang
InstalasiGolang
GOPATHDanWorkspace
InstalasiEditor
Command
ProgramPertama:HelloWorld
Komentar
Variabel
TipeData
Konstanta
Operator
SeleksiKondisi
Perulangan
Array
Slice
Map
Fungsi
FungsiMultipleReturn
FungsiVariadic
FungsiClosure
FungsiSebagaiparameter
Pointer
Struct
Method
PropertyPublic&Private
Interface
InterfaceKosong
Reflect
Goroutine
2
-
1.31
1.32
1.33
1.34
1.35
1.36
1.37
1.38
1.39
1.40
1.41
1.42
1.43
1.44
1.45
1.46
1.47
1.48
1.49
1.50
1.51
1.52
1.53
1.54
1.55
1.56
1.57
1.58
Channel
BufferedChannel
Channel-Select
Channel-Range&Close
Channel-Timeout
Defer&Exit
Error&Panic
LayoutFormatString
Time,ParsingTime,&FormatTime
Timer
KonversiData
FungsiString
Regexp
Encode-DecodeBase64
HashSha1
Arguments&Flag
Exec
File
Web
URLParsing
JSON
WebJSONAPI
HTTPRequest
SQL
MongoDB
UnitTest
WaitGroup
Mutex
3
-
DasarPemrogramanGolangGolang(atauGo)adalahbahasapemrogramanbaru,yangmulaidilirikolehparadeveloperkarenakelebihan-kelebihanyangdimilikinya.Sudahbanyakperusahaanbesaryangmenggunakanbahasainiuntukproduk-produkmerekahinggadilevelproduction.
BukuinimerupakansalahsatudarisekianbanyakreferensiyangbisadigunakanuntukbelajarpemrogramanGolang.Halyangdisampaikandisinibenar-benardasar,denganpembelajaranmulaidari0.Diharapkandenganadanyabukuinikawan-kawanbisalebihpahamdalammemahamisepertiapasihGolangitu.
EbookDasarPemrogramanGolanggratisuntukdisebarluaskansecarabebas,selamatidakmelanggaraturanlisensiGNULGPL2.1.
Sourcecodecontoh-contohprogrambisadiunduhdiGithub.Dianjurkanuntuktidakcopy-pastedarisourcecodedalambelajar,usahakanuntukmenulissendirikodeprogram,agarcepatterbiasadenganbahasaGolang.
Versi1.2017.05.13
Bukuinibisadi-downloaddalambentukPDF,linkdownloadPDF.
BantudeveloperlainuntukmengenaldanbelajarGolang,dengancaratweetbukuiniatausharekefacebook.
BukuinidibuatolehNovalAgungPrayogo.Untukpertanyaan,kritik,dansaran,[email protected].
Introduction
4
https://golang.org/https://github.com/golang/go/wiki/GoUsershttp://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.htmlhttps://github.com/novalagung/dasarpemrogramangolanghttps://www.gitbook.com/download/pdf/book/novalagung/dasarpemrogramangolanghttps://twitter.com/intent/tweet?text=Ebook Gratis! Dasar Pemrograman Golang - Belajar pemrograman Golang mulai dari 0&url=https://www.gitbook.com/read/book/novalagung/dasarpemrogramangolanghttp://www.facebook.com/sharer.php?s=100&p[title]=Dasar Pemrograman Golang&p[summary]=Belajar pemrograman Golang mulai dari 0 - Noval Agung Prayogo&p[url]=https://www.gitbook.com/read/book/novalagung/dasarpemrogramangolangmailto:[email protected]
-
Introduction
5
-
BerkenalanDenganGolangGolang(ataubiasadisebutdenganGo)adalahbahasapemrogramanbaruyangdikembangkandiGoogleolehRobertGriesemer,RobPike,danKenThompsonpadatahun2007danmulaidiperkenalkandipubliktahun2009.
PenciptaanbahasaGolangdidasaribahasaCdanC++,olehkarenaitugayasintaks-nyamirip.
KelebihanGolangGolangmemilikikelebihandibandingbahasalainnya,beberapadiantaranya:
MendukungkonkurensidilevelbahasadenganpengaplikasiancukupmudahMendukungpemrosesandatadenganbanyakprosesordalamwaktuyangbersamaan(pararelprocessing)MemilikigarbagecollectorProseskompilasisangatcepatBukanbahasapemrogramanyanghirarkial,menjadikandevelopertidakperluribetmemikirkansegmenOOP-nyaPackage/modulyangdisediakanterbilanglengkap.Karenabahasainiopensource,banyaksekalideveloperyangjugamengembangkanmodul-modullainyangbisadimanfaatkan
Meskipunbahasainimasihberumursekitar5tahunan,sudahbanyakindustridanperusahaanygmenggunakanGolangsampailevelproduction,termasukdiantaranyaadalahGooglesendiri.
DibukuinikitaakanbelajartentangdasarpemrogramanGolangmulaidari0.
BerkenalanDenganGolang
6
-
InstalasiGolangHalpertamayangperludilakukansebelumbisamenggunakanGolangadalahmenginstalnyaterlebihdahulu.Carainstalasinyaberbeda-bedauntuktiapjenissistemoperasi.PanduaninstalasiGolangsebenarnyasudahdisediakan,bisadilihatdisitusofficial-nyahttp://golang.org/doc/install#install.
BabinimerupakanringkasandaripanduaninstalasiyangdisediakanolehGolang.
DibukuiniversiGolangyangdigunakanadalah1.7.Direkomendasikanmenggunakanversitersebut,atauversilainminimal1.4.2keatas.
Digolang,perbedaansignifikanantaraversi1.4.2,1.5,1.6,1.7kebanyakanadalahdibagianperforma,hanyasedikitupdatedibagiansintaksbahasa.
InstalasiGolangdiWindows1. Downloadterlebihdahuluinstaller-nya.Pilihsesuaijenisbitprosesoryangdigunakan.
32bit=>go1.7.wind*ws-386.msi64bit=>go1.7.wind*ws-amd64.msi
1. Setelahter-download,jalankaninstaller,kliknextsampaiprosesinstalasiselesai.Default-nyaGolangakanterinstaldic:\go\bin.Pathtersebutakansecaraotomatisterdaftardipathvariable.
2. BukaCommandPrompt/CMD,eksekusiperintahberikutuntukmengetesapakahGolangsudahterinstaldenganbenar.
$goversion
3. JikaoutputcommanddiatasadalahversiGolangyangdi-instal,makainstalasiberhasil.
SeringterjadicommandgoversiontidakbisadijalankanmeskipunGolangsudahterinstal.SolusinyaadalahdenganrestartCMD(closeCMD,lalubukakembali).Setelahitucobajalankansekalilagicommandtersebut.
InstalasiGolangdiMacOSX
InstalasiGolang
7
http://golang.org/doc/install#installhttps://golang.org/doc/go1.4.2https://golang.org/doc/go1.5https://golang.org/doc/go1.6https://golang.org/doc/go1.7https://storage.googleapis.com/golang/go1.7.windows-386.msihttps://storage.googleapis.com/golang/go1.7.windows-amd64.msi
-
CaratermudahinstalasiGolangdiM*cOSXadalahdenganmenggunakanhomebrew.HomebrewsendiriadalahpackagemanagerkhususuntukM*cOSX(miripsepertiapt-getmilikUbuntu).
DibawahinimerupakanlangkahinstalasiGolangmenggunakanhomebrew.
1. Installterlebihdahuluhomebrew(jikabelumada),dengancaramengeksekusiperintahberikutditerminal.
$ruby-e"$(curl-fsSLhttp://git.io/pVOl)"
2. InstallGolangmenggunakancommandbrew.
$brewinstallgo
3. Selanjutnya,eksekusiperintahdibawahiniuntukmengetesapakahgolangsudahterinstaldenganbenar.
$goversion
4. JikaoutputcommanddiatasadalahversiGolangyangdi-instal,makainstalasiberhasil.
InstalasiGolangdiUbuntuCaramenginstalGolangdiUb*ntubisadenganmemanfaatkanapt-get.Silakanikutipetunjukdibawahini.
1. Jalankancommandberikutditerminal.
$sudoadd-apt-repositoryppa:gophers/go$sudoapt-getupdate$sudoapt-getinstallGolang-stable
2. Setelahinstalasiselesai,eksekusiperintahdibawahiniuntukmengetesapakahGolangsudahterinstaldenganbenar.
$goversion
3. JikaoutputcommanddiatasadalahversiGolangyangdi-instal,makainstalasiberhasil.
InstalasiGolang
8
http://brew.sh/
-
InstalasiGolangdiDistroLinuxLain1. Downloadarchiveberikut,pilihsesuaijenisbitkomputeranda.
32bit=>go1.7.lin*x-386.tar.gz64bit=>go1.7.lin*x-amd64.tar.gz
1. Bukaterminal,ekstrakarchivetersebutke/usr/local.Setelahituexportpath-nya.Gunakancommanddibawahiniuntukmelakukanhaltersebut.
$tarzxvfgo1.7.lin*x-....tar.gz-C/usr/local$exportPATH=$PATH:/usr/local/go/bin
2. Selanjutnya,eksekusiperintahberikutuntukmengetesapakahGolangsudahterinstaldenganbenar.
$goversion
3. JikaoutputcommanddiatasadalahversiGolangyangdi-instal,makainstalasiberhasil.
InstalasiGolang
9
https://storage.googleapis.com/golang/go1.7.linux-386.tar.gzhttps://storage.googleapis.com/golang/go1.7.linux-amd64.tar.gz
-
GOPATHDanWorkspaceSetelahGolangberhasildi-instal,adahalyangperludisiapkansebelumbisamasukkesesipembuatanaplikasi,yaitusetupworkspaceuntukproyek-proyekyangakandibuat.Dandibabinikitaakanbelajarbagaimanacaranya.
VariabelGOPATHGOPATHadalahvariabelyangdigunakanolehGolangsebagairujukanlokasidimanasemuafolderproyekdisimpan.Gopathberisikian3buahsubfolder:src,bin,danpkg.
ProyekdiGolangharusditempatkanpadapath$GOPATH/src.Sebagaicontohkitainginmembuatproyekdengannamabelajar,makaharusdibuatkansebuahfolderdengannamabelajarditempatkandalamsrc($GOPATH/src/belajar).Nantinyasemuafileuntukkeperluanproyekyangbersangkutanditempatkandisana.
Pathseparatoryangdigunakansebagaicontohdibukuiniadalahslash/.KhususpenggunaWind*ws,pathseparatoradalahbackslah\.
SetupWorkspaceLokasiataualamatfolderyangakandijadikansebagaiworkspacebisaditentukansendiri.Andabisamenggunakanalamatfoldermanasaja,bebas.LokasitersebutperludisimpankedalampathvariabledengannamaGOPATH.Sebagaicontoh,sayamemilihpath$HOME/Documents/go,makasayadaftarkanalamattersebut.Caranya:
BagipenggunaWind*ws,tambahkanpathfoldertersebutkepathvariabledengannamaGOPATH.Setelahvariabeldidaftarkan,cekapakahpathsudahterdaftardenganbenar.
SeringterjadiGOPATHtidakdikenalimeskipunvariabelsudahdidaftarkan.Jikahalsepertiiniterjadi,restartcommandpromptanda,lalucobalagi.
Bagipenggunanon-Wind*ws,gunakankeywordexportuntukmendaftarkanGOPATH.
$exportGOPATH=$HOME/Documents/go
Setelahvariabeldidaftarkan,cekapakahpathsudahterdaftardenganbenar.
GOPATHDanWorkspace
10
-
SetelahGOPATHberhasildikenali,perludisiapkan3buahsubfolderdidalamnyadengankriteriasebagaiberikut:
Foldersrc,adalahpathdimanaproyekgolangdisimpanFolderpkg,berisifilehasilkompilasiFolderbin,berisifileexecutablehasilbuild
StrukturdiatasmerupakanstrukturstandarworkspaceGolang.Jadipastikanpenamaandanhirarkifolderadalahsama.
GOPATHDanWorkspace
11
-
InstalasiEditorPembuatanprogrammenggunakanbahasaGolang,akanlebihmaksimaljikadidukungeditoratauIDEyangpas.Adacukupbanyakpilihanbagusyangbisadipertimbangkan,diantaranya:Intellij,Netbeans,Atom,Brackets,danlainnya.
Padasaatmenulisbukuini,editoryangsayagunakanadalahSublimeText3.Editoriniringan,mudahdidapat,danmemilikicukupbanyakplugin.Andabisamemiliheditoryangsamadenganyangdigunakandibukuini,ataueditorlainnya,bebas,yangpentingnyamanketikadigunakan.
BagiyangmemilihSublime,sayasarankanuntukmenginstallpluginbernamaGoSublime.PlugininimenyediakanbanyaksekalifituryangsangatmembantuprosespengembanganaplikasimenggunakanGolang.Diantaranyaseperticodecompletion,lint(deteksikesalahandilevelsintaks),perapiankodeotomatis,danlainnya.
DibabiniakandijelaskanbagaimanacarainstalasieditorSublime,packagecontrol,danpluginGoSublime.
InstalasiEditorSublimeText1. DownloadSublimeTextversi3dihttp://www.sublimetext.com/3,pilihsesuaidengan
sistemoperasiyangdigunakan.2. Setelahter-download,bukafiletersebutuntukmemulaiinstalasi.3. Setelahinstalasiselesai,jalankanaplikasi.
InstalasiPackageControlPackagecontrolmerupakanaplikasi3rdpartyuntukSublime,digunakanuntukmempermudahinstalasiplugin.Default-nyaSublimetidakmenyediakanaplikasini,kitaperlumenginstalnyasendiri.Silakanikutipetunjukberikutuntukcarainstalasinya.
InstalasiEditor
12
http://www.sublimetext.com/3
-
1. Bukasitushttps://packagecontrol.io/installation,copyscriptyangadaditabSublimeText3(tabbagiankiri).
2. Selanjutnya,jalankanaplikasiSublime,klikmenuView>ShowConsole,lalupastescriptyangsudahdi-copytadi,keinputankecildibagianbawaheditor.LalutekanEnter.
3. Tungguhinggaprosesinstalasiselesai.Perhatikankaraktersamadengan(=)dibagiankiribawaheditoryangbergerak-gerak.Jikakaraktertersebutmenghilang,menandakanbahwaprosesinstalasisudahselesai.
4. Setelahselesai,tutupaplikasi,lalubukakembali.Packagecontrolsudahberhasildi-install.
InstalasiPluginGoSublimeDenganmemanfaatkanpackagecontrol,instalasipluginakanmenjadilebihmudah.BerikutmerupakanlangkahinstalasipluginGoSublime.
1. BukaSublime,tekanctrl+shift+p(ataucmd+shift+puntukpengguna*SX),akanmunculsebuahinputdialog.Ketikandisanainstall,lalutekanenter.
InstalasiEditor
13
https://packagecontrol.io/installation
-
2. Akanmuncullagiinputdialoglainnya,ketikkanGoSublimelalutekanenter.Tungguhinggaprosesselesai(acuaninstalasiselesaiadalahkaraktersamadengan(=)dibagiankiribawaheditoryangsebelumnyabergerak-gerak.Ketikakaraktertersebutsudahhilang,menandakanbahwainstalasiselesai).
3. Setelahselesai,restartSublime,pluginGoSublimesudahberhasilter-install.
InstalasiEditor
14
-
CommandPengembanganaplikasiGolangtakjauhdarihal-halyangberbaucommandlineinterface.Sepertikompilasi,testing,eksekusiprogram,semuadilakukanlewatcommandline.
Golangmenyediakancommandgountukkeperluanpengembanganaplikasi.Dibabinikitaakanbelajarmengenaipemanfaatannya.
CommandgorunCommandgorundigunakanuntukeksekusifileprogram(fileber-ekstensi.go).Carapenggunaannyaadalahdenganmenuliskancommandtersebutdiikutnamafile.
Berikutadalahcontohpenerapangorununtukeksekusifileprogrambab5.goyangtersimpandipath$GOPATH/src/belajar-golang.
$cd$GOPATH/src/belajar-golang$gorunbab5.go
Commandgorunhanyabisadigunakanpadafileyangpackage-nyaadalahmain.Untuklebihjelasnyaakandibahaspadababselanjutnya(bab6).
Jikaadabanyakfileyangber-packagemaindanfile-filetersebutdi-importdifileutama,makaeksekusinyaadalahdenganmenyisipkansemuafilesebagaiargumentgorun(lebihjelasnyaakandibahaspadabab25).Contohnyabisadilihatpadakodeberikut.
$gorunbab5.golibrary.go
CommandgotestGolangmenyediakanpackagetestingyangbisadimanfaatkanuntukkeperluanunittesting.Fileyangakandi-testharusber-suffix_test.go.
Command
15
-
Berikutadalahcontohpenggunaancommandgotestuntuktestingfilebab5_test.go.
$gotestbab5_test.go
CommandgobuildCommandinidigunakanuntukmengkompilasifileprogram.
Sebenarnyaketikaeksekusiprogrammenggunakangorun,terjadiproseskompilasijuga,hanyasajafilehasilkompilasiakandisimpanpadafoldertemporaryuntukselanjutnyalangsungdieksekusi.
Berbedadengangobuild,commandinimenghasilkanfileexecutablepadafolderyangsedangaktif.Contohnyabisadilihatpadakodeberikut.
Padacontohdiatas,filebab5.godi-build,menghasilkanfilebarupadafolderyangsama,yaitubab5,yangkemudiandieksekusi.
PadapenggunaWind*ws,fileexecutableber-ekstensi.exe.
CommandgoinstallCommandgoinstallmemilikifungsiyangsamadengangobuild,hanyasajasetelahproseskompilasiselesai,dilanjutkankeprosesinstalasiprogramyangbersangkutan.
Targeteksekusiharusberupafolderproyek(bukanfile.go),danpathfoldertersebutdituliskanrelatifterhadap$GOPATH/src.Contoh:
$goinstallgithub.com/novalagung/godong
goinstallmenghasilkanoutputberbedauntukpackagemaindannon-main.
Padapackagenon-main,menghasilkanfileberekstensi.atersimpandalamfolder$GOPATH/pkg
Padapackagemain,menghasilkanfileexecutabletersimpandalamfolder$GOPATH/bin
Command
16
-
Berikutmerupakancontohpenerapangoinstall.
Padakodediatasbisadilihatcommandgoinstalldieksekusi2kali.
1. Padapackagenon-main,github.com/novalagung/godong.Hasilinstalasiadalahfileberekstensi.atersimpanpadafolder$GOPATH/pkg
2. Padapackagemain,github.com/novalagung/godong/godong_test.Hasilinstalasiadalahfileexecutabletersimpanpadafolder$GOPATH/bin
CommandgogetCommandiniberbedadengancommand-commandyangsudahdibahasdiatas.gogetdigunakanuntukmen-downloadpackage.Sebagaicontohsayainginmen-downloadpackagemgo.
$gogetgopkg.in/mgo.v2$ls$GOPATH/src/gopkg.in/mgo.v2
gopkg.in/mgo.v2adalahalamaturlpackagemgo.Packageyangsudahter-downloadakantersimpanpada$GOPATH/srcdenganstrukturfoldersesuaidenganurlpackage-nya.Sebagaicontoh,packagemgodiatastersimpandi$GOPATH/src/gopkg.in/mgo.v2.
Command
17
-
Command
18
-
ProgramPertama:HelloWorldSemuapersiapansudahselesai,saatnyamulaimasukpadasesipembuatanprogram.ProgrampertamayangakandibuatadalahaplikasisederhanauntukmemunculkantulisanHelloWorld.
Dibabiniakandijelaskansecarabertahapdariawal.Mulaipembuatanproyek,pembuatanfileprogram,sesipenulisankode(coding),hinggaeksekusiaplikasi.
LoadGOPATHKeSublimeTextHalpertamayangperludilakukan,adalahme-loadataumemunculkanfolderGOPATHdieditorSublime.Denganbegituproyek-proyekGolangakanlebihmudahdi-maintain.Caranya:
1. BukaSublime2. Bukaexplorer/finder,lalucarikefolderyangmerupakanGOPATH3. Klik-dragfoldertersebut(kebetulanlokasifolderGOPATHsayabernamago),tarikke
Sublime4. SeluruhsubfolderGOPATHakanterbukadiSublime
Namavariabeldisistemoperasinon-Wind*wsdiawalidengantandadollar$,sebagaicontoh$GOPATH.SedangkandiWind*ws,namavariabeldiapitkarakterpersen%,contohnyaseperti%GOPATH%.
MenyiapkanFolderProyekSelanjutnyakitasiapkansebuahproyekuntukkeperluanpembuatanprogram.Buatdirektoribarudalam$GOPATH/srcdengannamafoldersilakanditentukansendiri(bolehmenggunakannamabelajar-golangataulainnya).Agarlebihpraktis,buatfoldertersebutlewatSublime.Berikutadalahcaranya.
ProgramPertama:HelloWorld
19
-
1. Klikkanandifoldersrc2. KlikNewFolder,dibagianbawahakanmunculinputankecilFolderName3. Ketikkannamafolder,belajar-golang,laluenter
MenyiapkanFileProgramFileprogramdisinimaksudnyaadalahfileyangberisikankodeprogramGolang,fileyangberekstensi.go.
Didalamproyekyangtelahdibuat($GOPATH/src/belajar-golang/),perludisiapkansebuahfiledengannamabebas,yangjelasharusber-ekstensi.go(Padacontohinisayamenggunakannamafilebab6-hello-world.go).
PembuatanfileprogramjugaakandilakukanlewatSublime.Caranyasilakanikutpetunjukberikut.
1. Klikkanandifolderbelajar-golang2. KlikNewFile,makaakanmuncultabbarudibagiankanan3. Ketikkandikonten:bab6-hello-world.go4. Lalutekanctrl+s(cmd+suntukM*cOSX),kemudianenter5. Fileakanterbuat
ProgramPertama:HelloWorld
20
-
ProgramPertama:HelloWordSetelahfolderproyekdanfileprogramsudahsiap,saatnyauntukmulaimasukkesesipenulisanprogramataucoding.
Dibawahinimerupakancontohkodeprogramsederhanauntukmemunculkantextatautulisan"helloworld"kelayaroutput(commandline).
Silakansalinkodeberikutkefileprogramyangtelahdibuat.Sebisamungkinjangancopypaste.Biasakanuntukmenulisdariawal,agarcepatterbiasadanfamiliardenganpemrogramanGolang.
packagemain
import"fmt"
funcmain(){fmt.Println("helloworld")}
Setelahkodedisalin,bukaterminal(atauCMDbagipenggunaWind*ws),lalumasukkedirektoriproyekmenggunakanperintahcd.
Wind*ws
$cd%GOPATH%\src\belajar-golang
Non-Wind*ws
$cd$GOPATH/src/belajar-golang
ProgramPertama:HelloWorld
21
-
Setelahitujalankanprogramdenganperintahgorun.
$gorunbab6-hello-world.go
Akanmuncultulisanhelloworlddilayarconsole.
Selamat!AndatelahberhasilmembuatprogrammenggunakanGolang!
Meskikodeprogramdiatassangatsederhana,mungkinakanmunculbeberapapertanyaandibenak.Dibawahinimerupakandetailpenjelasanmengenaikodediatas.
PenggunaanKeywordpackageSetiapfileprogramharusmemilikipackage.Setiapproyekharusadasatufiledenganpackagebernamamain.Fileyangber-packagemain,akandieksekusipertamakaliketikaprogramdijalankan.
Carapenentuanpackageadalahmenggunakankeywordpackage,berikutadalahcontohpenggunaannya.
packagepackagemain
PenggunaanKeywordimportKeywordimportdigunakanuntukmeng-includepackagelainkedalamfileprogram,agarisipackageyangdi-includebisadimanfaatkan.
PackagefmtmerupakansalahsatupackageyangdisediakanolehGolang,berisikanbanyakfungsiuntukkeperluanI/Oyangberhubungandengantext.
ProgramPertama:HelloWorld
22
-
Berikutadalahskemapenulisankeywordimportbesertacontohnya.
import""import"fmt"
PenggunaanFungsimain()Dalamsebuahproyekharusadafileprogramyangberisikansebuahfungsibernamamain().Fungsitersebutharusberadadalampackageyangjugabernamamain.Fungsimain()adalahyangdipanggilpertamakalipadasaateksekusiprogram.
Berikutmerupakancontohpenulisannya.
funcmain(){
}
PenggunaanFungsifmt.Println()Fungsifmt.Println()digunakanuntukmemunculkantextkelayar(padakonteksini,terminalatauCMD).Diprogrampertamayangtelahkitabuat,fungsiinimemunculkantulisanHelloWorld.
Berikutadalahskemapenulisanfungsifmt.Println()besertacontohnya.
fmt.Println("")fmt.Println("helloworld")
Fungsifmt.Println()beradapadapackagefmt,makauntukmenggunakannyaperludi-importterlebihdahulupackagetersebut.
Fungsiinibisamenampungparameteryangtidakterbatasjumlahnya.Semuadataparameterakandimunculkandenganpemisahtandaspasi.Contohnyabisadilihatdikodeberikut.
fmt.Println("hello","world!","how","are","you")
Outputnya:helloworld!howareyou.
ProgramPertama:HelloWorld
23
-
ProgramPertama:HelloWorld
24
-
KomentarKomentarbiasadimanfaatkanuntukmenyisipkancatatanpadakodeprogram,menulispenjelasanataudeskripsimengenaisuatublokkode,ataubisajugadigunakanuntukme-remarkkode(men-non-aktifkankodeygtidakdigunakan).Komentarakandiabaikanketikakompilasimaupuneksekusiprogram.
Ada2jeniskomentardiGolang,inline&multiline.Dibabakandijelaskantentangpenerapandanperbedaankeduajeniskomentartersebut.
KomentarInlinePenulisankomentarjenisinidiawalidengantandadoubleslash(//)laludiikutipesankomentarnya.Komentarinlinehanyaberlakuutuksatubarispesansaja.Jikapesankomentarlebihdarisatubaris,makatanda//harusditulislagidibarisselanjutnya.
Berikutinimerupakancontohpenulisankomentarinline.
packagemain
import"fmt"
funcmain(){//komentarkode//menampilkanpesanhelloworldfmt.Println("helloworld")
//fmt.Println("barisinitidakakandieksekusi")}
Marikitapraktekankodediatas.Siapkanfileprogrambarudiproyekbelajar-golangdengannamabisaapasaja.isidengankodediatas,lalujalankan.
Hasilnyahanyatulisanhelloworldsajayangmunculdilayar,karenasemuayangdiawalitandadoubleslash//diabaikanolehcompiler.
KomentarMultiline
Komentar
25
-
Komentaryangcukuppanjangakanlebihrapijikaditulismenggunakanteknikkomentarmultiline.Ciridarikomentarjenisiniadalahpenulisannyadiawalidengantanda/*dandiakhiri*/.
/*komentarkodemenampilkanpesanhelloworld*/fmt.Println("helloworld")
//fmt.Println("barisinitidakakandieksekusi")
Sifatkomentarinisamasepertikomentarinline,yaitusama-samadiabaikanolehCompiler.
Komentar
26
-
VariabelGolangmengadopsiduajenispenulisanvariabel,yangdituliskantipedata-nyadanyangtidak.Keduacaratersebutintinyaadalahsama,pembedanyahanyalahcarapenulisannyasaja.
Padababiniakandikupastuntastentangmacam-macamcaradeklarasivariabel.
DeklarasiVariabelDenganTipeDataGolangmemilikiaturancukupketatdalamhalpenulisanvariabel.Padasaatdeklarasinya,tipedataygdigunakanharusdituliskanjuga.Istilahlaindarikonsepiniadalahmanifesttyping.
Berikutadalahcontohcarapembuatanvariabelyangtipedatanyaharusditulis.
packagemain
import"fmt"
funcmain(){varfirstNamestring="john"
varlastNamestringlastName="wick"
fmt.Printf("halo%s%s!\n",firstName,lastName)}
Keywordvardigunakanuntukdeklarasivariabel.ContohnyabisadilihatpadafirstNamedanlastName.NilaivariabelfirstNamediisilangsungketikadeklarasi,berbedadibandinglastNameyangnilainyadiisisetelahbariskodedeklarasi.CaratersebutdiperbolehkandiGolang.
DeklarasiVariabelMenggunakanKeywordvarPadakodediatasbisadilihatbagaimanasebuahvariabeldideklarasikandandisetnilainya.Keywordvardigunakanuntukmembuatvariabelbaru.
Variabel
27
-
Skemapenggunaankeywordvar:
varvar=
Contoh:
varlastNamestringvarfirstNamestring="john"
Nilaivariabelbisadiisilangsungpadasaatdeklarasivariabel.
PenggunaanFungsifmt.Printf()Fungsiinidigunakanuntukmenampilkanoutputdalambentuktertentu.Kegunaannyasamasepertifungsifmt.Println(),hanyasajastrukturoutputnyadidefinisikandiawal.
Perhatikanbagian"halo%s%s!\n",karakter%sdisituakandigantidengandatastringyangberadadiparameterke-2,ke-3,danseterusnya.
Agarlebihmudahdipahami,silakanperhatikankodeberikut.Ketigabariskodedibawahinimenghasilkanoutputyangsama,meskipuncarapenulisannyaberbeda.
fmt.Printf("halojohnwick!\n")fmt.Printf("halo%s%s!\n",firstName,lastName)fmt.Println("halo",firstName,lastName+"!")
Tandaplus(+)jikaditempatkandiantarastring,fungsinyaadalahuntukpenggabunganstring(concatenation).
Fungsifmt.Printf()tidakmenghasilkanbarisbarudiakhirtext,olehkarenaitudigunakanlahliteral\nuntukmemunculkanbarisbarudiakhir.Halinisangatberbedajikadibandingkandenganfungsifmt.Println()yangsecaraotomatismenghasilkanendline(barisbaru)diakhir.
DeklarasiVariabelTanpaTipeDataSelainmanifesttyping,Golangjugamengadopsimetodetypeinference,yaitumetodedeklarasivariabelyangtipedata-nyaditentukanolehtipedatanilainya,kontradiktifjikadibandingkandengancarapertama.Denganmetodejenisini,keywordvardantipedatatidakperluditulis.Agarlebihjelas,silakanperhatikankodeberikut.
Variabel
28
-
varfirstNamestring="john"lastName:="wick"
fmt.Printf("halo%s%s!\n",firstName,lastName)
VariabellastNamedideklarasikandenganmenggunakanmetodetypeinference.Penandanyatipedatatidakdituliskanpadasaatdeklarasi.Padapenggunaanmetodeini,operand=harusdigantidengan:=dankeywordvardihilangkan.
TipedatalastNamesecaraotomatisakanditentukanmenyesuaikanvalueataunilai-nya.Jikanilainyaadalahberupastringmakatipedatavariabeladalahstring.Padacontohdiatas,nilainyaadalahstring"wick".
Diperbolehkanuntuktetapmenggunakankeywordvarpadasaatdeklarasi,denganketentuantidakmenggunakantanda:=,melainkantetapmenggunakan=.Contohnyabisadilihatpadakodeberikut.
//menggunakanvar,tanpatipedata,menggunakanperantara"="varfirstName="john"
//tanpavar,tanpatipedata,menggunakanperantara":="lastName:="wick"
Keduadeklarasidiatasmaksudnyaadalahsama.Silakanpilihyangnyamandihati.
Tanda:=hanyadigunakansekalidiawalpadasaatdeklarasisaja.Setelahitu,untukassignmentnilaiselanjutnyaharusmenggunakantanda=.Contoh:
lastName:="wick"lastName="ethan"lastName="bourne"
DeklarasiMultiVariabelGolangmendukungmetodedeklarasibanyakvariabelsecarabersamaan,caranyadenganmenuliskanvariabel-variabel-nyadenganpembatastandakoma(,).Untukpengisiannilainya-pundiperbolehkansecarabersamaan.Contoh:
varfirst,second,thirdstringfirst,second,third="satu","dua","tiga"
Variabel
29
-
Pengisiannilaijugabisadilakukanbersamaanpadasaatdeklarasi.Caranyadenganmenuliskannilaimasing-masingvariabelberurutansesuaivariabelnyadenganpembataskoma(,).Contohnyasepertipadakodeberikut.
varfourth,fifth,sixthstring="empat","lima","enam"
Kalauinginlebihringkas:
seventh,eight,ninth:="tujuh","delapan","sembilan"
Denganmenggunakantekniktypeinference,deklarasimultivariabelbisadilakukanuntukvariabel-variabelyangtipedatasatusamalainnyaberbeda.Contoh:
one,isFriday,twoPointTwo,say:=1,true,2.2,"hello"
Istimewabukan?Istimewasekali.
VariabelUnderscore_Golangmemilikiaturanunikyangtidakdimilikibahasalain,yaitutidakbolehadasatupunvariabelyangmenganggur.Artinya,semuavariabelyangdideklarasikanharusdigunakan.Jikaadavariabelyangtidakdigunakantapidideklarasikan,programakangagaldikompilasi.
Underscore(_)adalahpredefinedvariabelyangbisadimanfaatkanuntukmenampungnilaiyangtidakdipakai.Bisadibilangvariabelinimerupakankeranjangsampah.Berikutadalahcontohpenggunaanvariabeltersebut.
_="belajarGolang"_="Golangitumudah"name,_:="john","wick"
Padacontohdiatas,variabelnameakanberisikantextjohn,sedangnilaiwickakanditampungolehvariabelunderscore,menandakanbahwanilaitersebuttidakakandigunakan.
Variabel
30
-
Variabelunderscoreadalahpredefined,jaditidakperlumenggunakan:=untukpengisiannilai,cukupdengan=saja.Namunkhususuntukpengisiannilaimultivariabelyangdilakukandenganmetodetypeinference,bolehdidalamnyaterdapatvariabelunderscore.
Biasanyaunderscoreseringdimanfaatkanuntukmenampungnilaibalikfungsiyangtidakdigunakan.
Perludiketahui,bahwaisivariabelunderscoretidakdapatditampilkan.Datayangsudahmasukvariabeltersebutakanhilang.Ibaratblackhole,sekalimasuk,tidakakanbisakeluar:-)
DeklarasiVariabelMenggunakanKeywordnewKeywordnewdigunakanuntukmencetakdatapointerdengantipedatatertentu.Nilaidatadefault-nyaakanmenyesuaikantipedatanya.Contohpenerapannya:
name:=new(string)
fmt.Println(name)//0x20818a220fmt.Println(*name)//""
Variabelnamemenampungdatabertipepointerstring.Jikaditampilkanyangmunculbukanlahnilainyamelainkanalamatmemorinilaitersebut(dalambentuknotasiheksadesimal).Untukmenampilkannilaiaslinya,variabeltersebutperludi-dereferenceterlebihdahulu,menggunakantandaasterisk(*).
Mungkinuntuksekarangbanyakyangakanbingung,namuntakapa,karenanantinyadibab22akandikupashabistentangapaitupointerdandereference.
DeklarasiVariabelMenggunakanKeywordmake
Keywordinihanyabisadigunakanuntukpembuatanbeberapajenisvariabelsaja,yaitu:
channelslicemap
Danlagi,mungkinbanyakyangakanbingung,tapitakapa.Ketikasudahmasukkepembahasanmasing-masingpointersebut,akanterlihatapakegunaandarikeywordini.
Variabel
31
-
Variabel
32
-
TipeDataGolangmengenalbeberapajenistipedata,diantaranyaadalahtipedatanumerik(desimal&non-desimal),string,danboolean.
Dibab-babsebelumnyasecarataksadarkitasudahmenerapkanbeberapatipedata,sepertistringdantipenumerikint.
Padababini,akandijelaskanbeberapamacamtipedatastandaryangdisediakanolehGolang,danbagaimancarapenggunaannya.
TipeDataNumerikNon-DesimalTipedatanumeriknon-desimalataunonfloatingpointdiGolangadabeberapamacam.Secaraumumada2tipedatayangperludiketahui,yaitu:
uint,merupakantipedatauntukbilangancacah(bilanganpositif),danint,merupakantipedatauntukbilanganbulat(bilangannegatifdanpositif)
Keduatipedatadiataskemudiandibagilagimenjadibeberapa,denganpembagianberdasarkanlebarcakupannilainya,detailnyabisadilihatditabelberikut.
Tipedata Cakupanbilangan
uint8 0↔255
uint16 0↔65535
uint32 0↔4294967295
uint64 0↔18446744073709551615
uint samadenganuint32atauuint64(tergantungnilai)
byte samadenganuint8
int8 -128↔127
int16 -32768↔32767
int32 -2147483648↔2147483647
int64 -9223372036854775808↔9223372036854775807
int samadenganint32atauint64(tergantungnilai)
rune samadenganint32
TipeData
33
-
Dianjurkanuntuktidaksembarangandalammenentukantipedatavariabel,sebisamungkintipeyangdipilihharusdisesuaikandengannilainya,karenaefeknyaadalahkealokasimemorivariabel.Pemilihantipedatayangtepatakanmembuatpemakaianmemorilebihoptimal,tidakberlebihan.
Contohpenggunaanvariabelnumeriknon-desimalbisadilihatdikodeberikut.
varpositiveNumberuint8=89varnegativeNumber=-1243423644
fmt.Printf("bilanganpositif:%d\n",positiveNumber)fmt.Printf("bilangannegatif:%d\n",negativeNumber)
VariabelpositiveNumberbertipeuint8dengannilaiawal89.SedangkanvariabelnegativeNumberdideklarasikandengannilaiawal-1243423644.Compilersecaracerdasakanmenentukantipedatavariabeltersebutsebagaiint32(karenaangkatersebutmasukkecakupantipedataint32).
Template%dpadafmt.Printf()digunakanuntukmemformatdatanumeriknon-desimal.
TipeDataNumerikDesimalTipedatanumerikdesimalyangperludiketahuiada2,float32danfloat64.Perbedaankeduatipedatatersebutberadadilebarcakupannilaidesimalyangbisaditampung.UntuklebihjelasnyabisamerujukkespesifikasiIEEE-75432-bitfloating-pointnumbers.Contohpenggunaantipedatainibisadilihatdikodeberikut.
vardecimalNumber=2.62
fmt.Printf("bilangandesimal:%f\n",decimalNumber)fmt.Printf("bilangandesimal:%.3f\n",decimalNumber)
Padakodediatas,variabeldecimalNumberakanmemilikitipedatafloat32,karenanilainyaberadadicakupantipedatatersebut.
Template%fdigunakanuntukmemformatdatanumerikdesimalmenjadistring.Digitdesimalyangakandihasilkanadalah6digit.Padacontohdiatas,hasilformatvariabeldecimalNumberadalah2.620000.Jumlahdigityangmunculbisadikontrolmenggunakan
TipeData
34
http://www.h-schmidt.net/FloatConverter/IEEE754.html
-
%.nf,tinggalgantindenganangkayangdiinginkan.Contoh:%.3fmakaakanmenghasilkan3digitdesimal,%.10fmakaakanmenghasilkan10digitdesimal.
TipeDatabool(Boolean)Tipedataboolberisikanhanya2variansinilai,truedanfalse.Tipedatainibiasadimanfaatkandalamseleksikondisidanperulangan(yangnantinyaakankitabahaspadabab12danbab13).Contohsederhanapenggunaanbool:
varexistbool=truefmt.Printf("exist?%t\n",exist)
Gunakan%tuntukmemformatdataboolmenggunakanfungsifmt.Printf().
TipeDatastringCirikhasdaritipedatastringadalahnilainyadiapitolehtandaquoteataupetikdua(").Contohpenerapannya:
varmessagestring="Halo"fmt.Printf("message:%s\n",message)
Selainmenggunakantandaquote,deklarasistringjugabisadengantandagraveaccent/backticks( ̀ ),tandainiterletakdisebelahkiritombol1.Keistimewaanstringyangdideklarasikanmenggunakanbackticsadalahmembuatsemuakarakterdidalamnyatidakakandiescape,termasuk\n,tandapetikduadantandapetiksatu,barisbaru,danlainnya.Semuaakanterdeteksisebagaistring.Berikutadalahcontohpenerapannya.
varmessage=`Namasaya"JohnWick".Salamkenal.Maribelajar"Golang".`
fmt.Println(message)
Ketikadijalankan,outputakanmunculsamapersisisesuainilaivariabelmessagediatas.Tandapetikduaakanmuncul,barisbarujugamuncul,samapersis.
TipeData
35
-
NilainilDanNilaiDefaultTipeDatanilbukanmerupakantipedata,melainkansebuahnilai.Variabelyangisinilainyanil,berartivariabeltersebutmemilikinilaikosong.
Semuatipedatayangsudahdibahasdiatasmemilikinilaidefault.Artinyameskipunvariabeldideklarasikandengantanpanilaiawal,akanadanilaidefault-nya.
Nilaidefaultstringadalah""(stringkosong)NilaidefaultbooladalahfalseNilaidefaulttipenumeriknon-desimaladalah0Nilaidefaulttipenumerikdesimaladalah0.0
niladalahnilaikosong,benar-benarkosong.niltidakbisadigunakanpadatipedatayangsudahdibahasdiatas,karenakesemuanyasudahmemilikinilaidefaultpadasaatdeklarasi.Adabeberapatipedatayangbisadi-setnilainyadengannil,diantaranya:
pointertipedatafungsislicemap
channel
interfacekosongatauinterface{}
Nantinyakitaakanseringbertemudengannilketikasudahmasukpadapembahasanbab-babtersebut.
TipeData
36
-
KonstantaKonstantaadalahvariabelyangnilainyatidakbisadiubah.Inisialisasinilaihanyadilakukansekalidiawal,setelahnyadatatidakbisadiubahnilainya.
PenggunaanKonstantaDatasepertipi(22/7),kecepatancahaya(299.792.458m/s),adalahcontohdatayangtepatjikadideklarasikansebagaikonstantadaripadavariabel,karenanilainyasudahpastidantidakberubah.
Carapenerapankonstantasamasepertideklarasivariabelbiasa,selebihnyatinggalgantikeywordvardenganconst.Contohnya:
constfirstNamestring="john"fmt.Print("halo",firstName,"!\n")
Tekniktypeinferencebisaditerapkanpadakonstanta,caranyayaitucukupdenganmenghilangkantipedatapadasaatdeklarasi.
constlastName="wick"fmt.Print("nicetomeetyou",lastName,"!\n")
PenggunaanFungsifmt.Print()Fungsiinimemilikiperanyangsamasepertifungsifmt.Println(),pembedanyafungsifmt.Print()tidakmenghasilkanbarisbarudiakhiroutputnya.
Perbedaanlainnyaadalah,nilaipadaparameter-parameteryangdimasukkankefungsitersebutdigabungkantanpapemisah.Tidaksepertipadafungsifmt.Println()yangnilaiparemeternyadigabungmenggunakanpenghubungspasi.Agarlebihmudahdipahami,perhatikankodeberikut.
Konstanta
37
-
fmt.Println("johnwick")fmt.Println("john","wick")
fmt.Print("johnwick\n")fmt.Print("john","wick\n")fmt.Print("john","","wick\n")
Kodediatasmenunjukkanperbedaanantarafmt.Println()danfmt.Print().Outputyangdihasilkanoleh5statementdiatasadalahsama,meskicarayangdigunakanberbeda.
Bilamenggunakanfmt.Println()tidakperlumenambahkanspasiditiapkata,karenafungsitersebutakansecaraotomatismenambahkannyadisela-selanilai.Berbedadenganfmt.Print(),perluditambahkanspasidisitu,karenafungsiinitidakmenambahkanspasidisela-selanilaiparameteryangdigabungkan.
Konstanta
38
-
OperatorBabinimembahasmengenaioperator-operatoryangbisadigunakandiGolang.Secaraumumoperatordibagimenjadi3kategori:operatoraritmatika,perbandingan,danlogika.
OperatorAritmatikaOperatoraritmatikaadalahoperatoryangdigunakanuntukoperasiyangsifatnyaperhitungan.Golangmendukungbeberapaoperatoraritmatikastandar,list-nyabisadilihatditabelberikut.
Tanda Penjelasan
+ penjumlahan
- pengurangan
* perkalian
/ pembagian
% modulus/sisahasilpembagian
Contohpenggunaannya:
varvalue=(((2+6)%3)*4-2)/3
OperatorPerbandinganOperatorperbandingandigunakanuntukmenentukankebenaransuatukondisi.Hasilnyaberupanilaiboolean,trueataufalse.
TabelberikutberisikanoperatorperbandinganyangbisadigunakandiGolang.
Operator
39
-
Tanda Penjelasan
== apakahnilaikirisamadengannilaikanan
!= apakahnilaikiritidaksamadengannilaikanan
< apakahnilaikirilebihkecildaripadanilaikanan
apakahnilaikirilebihbesardarinilaikanan
>= apakahnilaikirilebihbesaratausamadengannilaikanan
Contohpenggunaannya:
varvalue=(((2+6)%3)*4-2)/3varisEqual=(value==2)
fmt.Printf("nilai%d(%t)\n",value,isEqual)
Padakodediatas,terdapatstatementoperasiaritmatikayanghasilnyaditampungolehvariabelvalue.Selanjurnya,variabeltersebuttersebutdibandingkandenganangka2untukdicekapakahnilainyasama.Jikaiya,makahasilnyaadalahtrue,jikatidakmakafalse.NilaihasiloperasiperbandingantersebutkemudiandisimpandalamvariabelisEqual.
Untukmemunculkannilaiboolmenggunakanfmt.Printf(),bisamemakailayoutformat%t.
OperatorLogikaOperatorinidigunakanuntukmencaribenartidaknyakombinasidatabertipebool(yangbisaberupavariabelbertipebool,atauhasildarioperatorperbandingan).
Beberapaoperatorlogikastandaryangbisadigunakan:
Tanda Penjelasan
&& kiridankanan
|| kiriataukanan
! negasi/nilaikebalikan
Contohpenggunaannya:
Operator
40
-
varleft=falsevarright=true
varleftAndRight=left&&rightfmt.Printf("left&&right\t(%t)\n",leftAndRight)
varleftOrRight=left||rightfmt.Printf("left||right\t(%t)\n",leftOrRight)
varleftReverse=!leftfmt.Printf("!left\t\t(%t)\n",leftReverse)
Hasildarioperatorlogikasamadenganhasildarioperatorperbandingan,yaituberupanilaiboolean.
Berikutadalahpenjelasanstatemenoperatorlogikapadakodediatas.
leftAndRightbernilaifalse,karenahasildarifalsedantrueadalahfalseleftOrRightbernilaitrue,karenahasildarifalseatautrueadalahtrueleftReversebernilaitrue,karenanegasi(ataulawandari)falseadalahtrue
Template\tdigunakanuntukmenambahkanindenttabulasi.Biasadimanfaatkanuntukmerapikantampilanoutputpadaconsole.
Operator
41
-
SeleksiKondisiSeleksikondisidigunakanuntukmengontrolalurprogram.Kalaudianalogikan,fungsinyamiripsepertirambulalulintasdijalanraya.Kapankendaraandiperbolehkanmelajudankapanharusberhenti,diaturolehrambutersebut.Samasepertipadaseleksikondisi,kapansebuahblokkodeakandieksekusijugaakandiatur.
Yangdijadikanacuanolehseleksikondisiadalahnilaibertipebool,bisaberasadarivariabel,ataupunhasiloperasiperbandingan.Nilaitersebutakanmenentukanblokkodemanayangakandieksekusi.
Golangmemiliki2macamkeyworduntukseleksikondisi,yaituifelsedanswitch.Dibabinikitaakanmempelajarinyasatu-persatu.
Golangtidakmendukungseleksikondisimenggunakanternary.Statementseperti:vardata=(isExist?"ada":"tidakada")akanmenghasilkanerror.
SeleksiKondisiMenggunakanKeywordif,elseif,&elseCarapenerapanif-elsediGolangsamadenganpadabahasapemrogramanlain.Yangmembedakanhanyatandakurungnya(parentheses),diGolangtidakperluditulis.Kodeberikutmerupakancontohpenerapanseleksikondisiifelse,denganjumlahkondisi4buah.
varpoint=8
ifpoint==10{fmt.Println("lulusdengannilaisempurna")}elseifpoint>5{fmt.Println("lulus")}elseifpoint==4{fmt.Println("hampirlulus")}else{fmt.Printf("tidaklulus.nilaianda%d\n",point)}
Darike-empatkondisidiatas,yangterpenuhiadalahifpoint>5karenanilaivariabelpointmemanglebihbesardari5.Makablokkodetepatdibawahkondisitersebutakandieksekusi(blokkodeditandaikurungkurawalbukadantutup),text"lulus"akanmunculdiconsole.
SeleksiKondisi
42
-
SkemaifelseGolangsamasepertipadapemrogramanumumnya.Yaitudiawalseleksikondisimenggunakanif,danketikakondisinyatidakterpenuhiakanmenujukeelse(jikaada).Ketikaadabanyakkondisi,gunakanelseif.
Dibahasapemrogramanlain,ketikaadaseleksikondisiyangisiblok-nyahanya1barissaja,kurungkurawalbolehtidakdituliskan.BerbedadenganaturandiGolang,kurungkurawalharustetapdituliskanmeskiisinyahanya1bloksatement.
VariabelTemporaryPadaif-elseVariabeltemporaryadalahvariabelyanghanyabisadigunakanpadablokseleksikondisidimanaiaditempatkansaja.Penggunaanvariabelinimembawabeberapamanfaat,antaralain:
Scopeataucakupanvariabeljelas,hanyabisadigunakanpadablokseleksikondisiitusajaKodemenjadilebihrapiKetikanilaivariabeltersebutdidapatdarisebuahkomputasi,perhitungantidakperludilakukandidalamblokmasing-masingkondisi.
Berikutmerupakancontohpenerapannya.
varpoint=8840.0
ifpercent:=point/100;percent>=100{fmt.Printf("%.1f%sperfect!\n",percent,"%")}elseifpercent>=70{fmt.Printf("%.1f%sgood\n",percent,"%")}else{fmt.Printf("%.1f%snotbad\n",percent,"%")}
Variabelpercentnilainyadidapatdarihasilperhitungan,danhanyabisadigunakandideretanblokseleksikondisiitusaja.
Deklarasivariabeltemporaryhanyabisadilakukanlewatmetodetypeinferenceyangmenggunakantanda:=.Penggunaankeywordvardisitutidakdiperbolehkankarenaakanmenyebabkanerror.
SeleksiKondisi
43
-
SeleksiKondisiMenggunakanKeywordswitch
Switchmerupakanseleksikondisiyangsifatnyafokuspadasatuvariabel.Contohsederhananyasepertipenentuanapakahnilaivariabelxadalah:1,2,3,ataulainnya.Agarlebihjelas,silakanmelihatcontohdibawahini.
varpoint=6
switchpoint{case8:fmt.Println("perfect")case7:fmt.Println("awesome")default:fmt.Println("notbad")}
Padakodediatas,tidakadakondisiataucaseyangterpenuhikarenanilaivariabelpointadalah6.Ketikahalsepertiiniterjadi,blokkondisidefaultakandipanggil.Bisadibilangbahwadefaultmerupakanelsedalamsebuahswitch.
Perludiketahui,switchpadapemrogramanGolangmemilikiperbedaandibandingbahasalain.DiGolang,ketikasebuahcaseterpenuhi,tidakakandilanjutkankepengecekkancaseselanjutnya,meskipuntidakadakeywordbreakdisitu.Konsepiniberkebalikandenganswitchpadaumumnya,yangketikasebuahcaseterpenuhi,makaakantetapdilanjutmengecekcaseselanjutnyakecualiadakeywordbreak.
Pemanfaatan1caseUntukBanyakKondisiSebuahcasedapatmenampungbanyakkondisi.Carapenerapannyayaitudenganmenuliskannilaipembanding-pembandingvariabelyangdi-switchsetelahkeywordcasedipisahtandakoma(,).Contohbisadilihatpadakodeberikut.
SeleksiKondisi
44
-
varpoint=6
switchpoint{case8:fmt.Println("perfect")case7,6,5,4:fmt.Println("awesome")default:fmt.Println("notbad")}
Kondisicase7,6,5,4:akanterpenuhiketikanilaivariabelpointadalah7atau6atau5atau4.
KurungKurawalPadaKeywordcase&default
Tandakurungkurawal({})bisaditerapkanpadakeywordcasedandefault.Tandainiopsional,bolehdipakaibolehtidak.Bagusjikadipakaipadablokkondisiyangdidalamnyaadabanyakstatement,kodeakanterlihatlebihrapidanmudahdi-maintain.
Berikutadalahcontohpenggunaannya.Bisadilihatpadakeyworddefaultterdapatkurungkurawalyangmengapit2statementdidalamnya.
varpoint=6
switchpoint{case8:fmt.Println("perfect")case7,6,5,4:fmt.Println("awesome")default:{fmt.Println("notbad")fmt.Println("youcanbebetter!")}}
SwitchDenganGayaif-elseUniknyadiGolang,switchbisadigunakandengangayaalaif-else.Nilaiyangakandibandingkantidakdituliskansetelahkeywordswitch,melainkanakanditulislangsungdalambentukperbandingandalamkeywordcase.
SeleksiKondisi
45
-
Padakodedibawahini,kodeprogramswitchdiatasdiubahkedalamgayaif-else.Variabelpointdihilangkandarikeywordswitch,lalukondisi-kondisinyadituliskanditiapcase.
varpoint=6
switch{casepoint==8:fmt.Println("perfect")case(point<8)&&(point>3):fmt.Println("awesome")default:{fmt.Println("notbad")fmt.Println("youneedtolearnmore")}}
PenggunaanKeywordfallthroughDalamswitch
Sepertiyangkitasudahsinggungdiatas,bahwaswitchpadaGolangmemilikibeberapaperbedaandenganbahasalain.Ketikasebuahcaseterpenuhi,pengecekkankondisitidakakanditeruskankecase-casesetelahnya.
Keywordfallthroughdigunakanuntukmemaksaprosespengecekkanditeruskankecaseselanjutnya.Contohberikutmerupakanpenerapankeywordini.
varpoint=6
switch{casepoint==8:fmt.Println("perfect")case(point<8)&&(point>3):fmt.Println("awesome")fallthroughcasepoint<5:fmt.Println("youneedtolearnmore")default:{fmt.Println("notbad")fmt.Println("youneedtolearnmore")}}
SeleksiKondisi
46
-
Setelahpengecekkancase(point<8)&&(point>3)selesai,akandilanjutkepengecekkancasepoint<5,karenaadafallthroughdisitu.
SeleksiKondisiBersarangSeleksikondisibersarangadalahseleksikondisi,yangberadadalamseleksikondisi,yangmungkinjugaberadadalamseleksikondisi,danseterusnya.Nestedloopatauseleksikondisibersarangbisadilakukanpadaif-else,switch,ataupunkombinasikeduanya.Contohnya:
varpoint=10
ifpoint>7{switchpoint{case10:fmt.Println("perfect!")default:fmt.Println("nice!")}}else{ifpoint==5{fmt.Println("notbad")}elseifpoint==3{fmt.Println("keeptrying")}else{fmt.Println("youcandoit")ifpoint==0{fmt.Println("tryharder!")}}}
SeleksiKondisi
47
-
PerulanganPerulanganmerupakanprosesmengulang-ulangeksekusiblokkodetanpahenti,selamakondisiyangdijadikanacuanterpenuhi.Biasanyadisiapkanvariabeluntukiterasiatauvariabelpenandakapanperulanganakandiberhentikan.
DiGolangkeywordperulanganhanyaforsaja,tetapimeskidemikian,kemampuannyamerupakangabunganfor,foreach,danwhileibaratbahasapemrogramanlain.
PerulanganMenggunakanKeywordforAdabeberapacarastandarmenggunakanfor.Carapertamadenganmemasukkanvariabelcounterperulanganbesertakondisinyasetelahkeyword.Agarlebihmudahdipahami,cobaperhatikandanpraktekankodeberikut.
fori:=0;i<5;i++{fmt.Println("Angka",i)}
Perulangandiatashanyaakanberjalanketikavariabelibernilaidibawah5,denganketentuansetiapkaliperulangan,nilaivariabeliakandi-iterasiatauditambahkan1(i++artinyaditambahsatu,samasepertii=i+1).Karenaipadaawalnyabernilai0,makaperulanganakanberlangsung5kali,yaituketikaibernilai0,1,2,3,dan4.
PenggunaanKeywordforDenganArgumenHanyaKondisiCarake-2adalahdenganmenuliskankondisisetelahkeywordfor(hanyakondisi).Deklarasidaniterasivariabelcountertidakperludituliskan.Konsepnyamiripsepertiwhilemilikbahasapemrogramanlain.
Kodeberikutadalahcontohpenerapannya.Outputyangdihasilkansamasepertipadapenerapanformenggunakancarapertama.
Perulangan
48
-
vari=0
fori<5{fmt.Println("Angka",i)i++}
PenggunaanKeywordforTanpaArgumenCarake-3adalahforditulistanpakondisi.Denganiniakandihasilkanperulangantanpahenti(samadenganfortrue).Pemberhentianperulanganbisadilakukandenganmenggunakankeywordbreak.Contohpenerapannyabisadilihatdikodeberikut.
vari=0
for{fmt.Println("Angka",i)
i++ifi==5{break}}
Dalamperulangantanpahentidiatas,variabeliyangnilaiawalnya0di-inkrementasi.Ketikanilaiisudahmencapai5,keywordbreakdigunakan,danperulanganakanberhenti.
PenggunaanKeywordfor-rangeCarake-4adalahperulangandenganmenggunakankombinasikeywordfordanrange.Carainibiasadigunakanuntukme-loopingdatabertipearray.Detailnyaakandibahasdalambabselanjutnya(bab14).
PenggunaanKeywordbreak&continueKeywordbreakdigunakanuntukmenghentikansecarapaksasebuahperulangan,sedangkancontinuedigunakanuntukmemaksamajukeperulanganberikutnya.
Perulangan
49
-
Kodeberikutadalahcontohpenerapancontinuedanbreak.Keduakeywordtersebutdimanfaatkanuntukmenampilkanangkagenapberurutanyanglebihbesardari0dandibawah8.
fori:=1;i8{break}
fmt.Println("Angka",i)}
Kodediatas,sayakiraakanlebihmudahdicernajikadijelaskansecaraberurutan.Berikutadalahpenjelasannya.
1. Dilakukanperulanganmulaiangka1hingga10denganisebagaivariabeliterasi2. Ketikaiadalahganjil(dapatdiketahuidarii%2,jikahasilnya1,berartiganjil),
makaakandipaksalanjutkeperulanganberikutnya3. Ketikailebihbesardari8,makaperulanganakanberhenti4. Nilaimditampilkan
PerulanganBersarangTakhanyaseleksikondisiyangbisabersarang,perulanganjugabisa.Carapengaplikasiannyakuranglebihsama,tinggaltulisperulangandidalamperulangan.Contohnyabisadilihatdikodeberikut.
fori:=0;i<5;i++{forj:=i;j<5;j++{fmt.Print(j,"")}
fmt.Println()}
Perulangan
50
-
Dikodeini,untukpertamakalinyafungsifmt.Println()dipanggiltanpadisisipkanparameter.Carasepertiinidigunakanuntukmenampilkanbarisbaru.Kegunaannyasamasepertioutputdaristatementfmt.Print("\n").
PemanfaatanLabelDalamPerulanganDiperulanganbersarang,breakdancontinueakanberlakupadablokperulangandimanaiadigunakansaja.Adacaraagarkeduakeywordinibisatertujupadaperulanganterluaratauperulangantertentu,yaitudenganmemanfaatkanteknikpemberianlabel.
Programuntukmemunculkanmatriksberikutmerupakancontohpenerapannya.
outerLoop:fori:=0;i<5;i++{forj:=0;j<5;j++{ifi==3{breakouterLoop}fmt.Print("matriks[",i,"][",j,"]","\n")}}
Tepatsebelumkeywordforterluar,terdapatbariskodeouterLoop:.MaksuddarikodeituadalahdisiapkansebuahlabelbernamaouterLoopuntukfordibawahnya.Namalabelbisadigantidengannamalain(danharusdiakhiridengantandatitikduaataucolon(:)).
Padaforbagiandalam,terdapatseleksikondisiuntukpengecekannilaii.Ketikanilaitersebutsamadengan3,makabreakdipanggildengantargetadalahforyanglabel-nyaadalahouterLoop.Perulanganyangmemilikilabeltersebutakandiberhentikan.
Perulangan
51
-
Perulangan
52
-
ArrayArrayadalahkumpulandatabertipesama,yangdisimpandalamsebuahvariabel.Arraymemilikikapasitasyangnilainyaditentukanpadasaatpembuatan,menjadikanelemen/datayangdisimpandiarraytersebutjumlahnyatidakbolehmelebihiyangsudahdialokasikan.Defaultnilaitiapelemenarraypadaawalnyatergantungdaritipedatanya.Jikaintmakadefaultnya0,jikaboolmakadefault-nyafalse,dantipedatalain.Setiapelemenarraymemilikiindeksberupaangkayangmerepresentasikanposisiurutanelementersebut.Indeksarraydimulaidari0.
Contohpenerapanarray:
varnames[4]stringnames[0]="trafalgar"names[1]="d"names[2]="water"names[3]="law"
fmt.Println(names[0],names[1],names[2],names[3])
Variabelnamesdideklarasikansebagaiarraystringdenganalokasielemen4slot.Caramengisislotelemenarraybisadilihatdikodediatas,yaitudenganlangsungmengakseselemenmenggunakanindeks,lalumengisinya.
InisialisasiNilaiAwalArrayPengisianelemenarraybisadilakukanpadasaatdeklarasivariabel.Caranyadenganmenuliskandataelemendalamkurungkurawalsetelahtipedata,denganpembatasantarelemenadalahtandakoma(,).Berikutmerupakancontohnya.
varfruits=[4]string{"apple","grape","banana","melon"}
fmt.Println("Jumlahelement\t\t",len(fruits))fmt.Println("Isisemuaelement\t",fruits)
Array
53
-
Penggunaanfungsifmt.Println()padadataarraytanpamengaksesindekstertentu,akanmenghasilkanoutputdalambentukstringdarisemuaarrayyangada.Teknikinibiasadigunakanuntukdebuggingdataarray.
Fungsilen()digunakanuntukmenghitungjumlahelemensebuaharray.
InisialisasiNilaiArrayDenganGayaVertikalElemenarraybisadituliskandalambentukhorizontal(sepertiyangsudahdicontohkandiatas)ataupundalambentukvertikal.Contohnyabisadilihatdikodeberikut.
varfruits[4]string
//carahorizontalfruits=[4]string{"apple","grape","banana","melon"}
//caravertikalfruits=[4]string{"apple","grape","banana","melon",}
Perludiperhatikan,khususdeklarasimenggunakancaravertikal,perludituliskantandakomapadaakhirelementerakhir.Jikatidakditulisakanmunculerror.
InisialisasiNilaiAwalArrayTanpaJumlahElemenDeklarasiarrayyangnilainyadisetdiawal,bolehtidakdituliskanjumlahlebararray-nya,cukupgantidengantanda3titik(...).Jumlahelemenakandikalkulasisecaraotomatismenyesuaikandataelemenyangdiisikan.
varnumbers=[...]int{2,3,2,4,3}
fmt.Println("dataarray\t:",numbers)fmt.Println("jumlahelemen\t:",len(numbers))
Array
54
-
Variabelnumbersakansecaraajaibditentukanjumlahalokasinyayaitu5,karenapadasaatdeklarasidisiapkan5buahelemen.
ArrayMultidimensiArraymultidimensiadalaharrayyangtiapelemennyajugaberupaarray(danbisaseterusnya,tergantungjumlahdimensinya).
Caradeklarasiarraymultidimensisecaraumumsamadengancaradeklarasiarraybiasa.Cukupmasukandataarrayyangmerupakandimensiselanjutnya,sebagaielemenarraydimensisebelumnya.
Khususuntukarrayyangmerupakansubdimensiatauelemen,bolehtidakdituliskanjumlahdatanya.Contohnyabisadilihatpadadeklarasivariabelnumbers2dikodeberikut.
varnumbers1=[2][3]int{[3]int{3,2,3},[3]int{3,4,5}}varnumbers2=[2][3]int{{3,2,3},{3,4,5}}
fmt.Println("numbers1",numbers1)fmt.Println("numbers2",numbers2)
Keduaarraydiatasadalahsamanilainya.
PerulanganElemenArrayMenggunakanKeywordforKeywordfordanarraymemilikihubunganyangsangaterat.Denganmemanfaatkanperulanganmenggunakankeywordini,elemen-elemendalamarraybisadidapat.
Adabeberapacarayangbisadigunakanuntukme-loopingdataarray,ygpertamaadalahdenganmemanfaatkanvariabeliterasiperulanganuntukmengakseselemenberdasarkanindeks-nya.Contoh:
Array
55
-
varfruits=[4]string{"apple","grape","banana","melon"}
fori:=0;i<len(fruits);i++{fmt.Printf("elemen%d:%s\n",i,fruits[i])}
Perulangandiatasdijalankansebanyakjumlahelemenarrayfruits(bisadiketahuidarikondisii<len(fruits).Ditiapperulangan,elemenarraydiaksesdenganmemanfaatkanvariabeliterasii.
PerulanganElemenArrayMenggunakanKeywordfor-rangeAdacarayanglebihmudahyangbisadimanfaatkanuntukme-loopingsebuahdataarray,yaitumenggunakankeywordfor-range.Contohpengaplikasiannyabisadilihatdikodeberikut.
varfruits=[4]string{"apple","grape","banana","melon"}
fori,fruit:=rangefruits{fmt.Printf("elemen%d:%s\n",i,fruit)}
Arrayfruitsdiambilelemen-nyasecaraberurutan.Nilaitiapelemenditampungvariabelolehfruit(tanpahurufs),sedangkanindeksnyaditampungvariabeli.
Outputprogramdiatas,samadenganoutputprogramsebelumnya,hanyacarayangdigunakanberbeda.
PenggunaanVariabelUnderscore_Dalamfor-rangeKadangkalaketikaloopingmenggunakanfor-range,adakemungkinandimanadatayangdibutuhkanadalahelemen-nyasaja,indeks-nyatidak.Sedangkansepertidikodediatas,rangemengembalikan2data,yaituindeksdanelemen.
Array
56
-
Sepertiyangsudahdiketahui,bahwadiGolangtidakmemperbolehkanadanyavariabelyangmenagguratautidakdipakai.Jikadipaksakan,errorakanmuncul.
Disinilahsalahsatukegunaanvariabelpengangguran,atauunderscore(_).Tampungsajanilaiyangtidakingindigunakankeunderscore.
varfruits=[4]string{"apple","grape","banana","melon"}
for_,fruit:=rangefruits{fmt.Printf("namabuah:%s\n",fruit)}
Padakodediatas,yangsebelumnyaadalahvariabelidigantidengan_,karenakebetulanvariabelitidakdigunakan.
Jikayangdibutuhkanhanyaindekselemen-nyasaja,bisagunakan1buahvariabelsetelahkeywordfor.Contoh:
fori:=rangefruits{}//ataufori,_:=rangefruits{}
AlokasiElemenArrayMenggunakanKeywordmake
Deklarasisekaligusalokasidataarraybisadilakukanlewatkeywordmake.Contohnyabisadilihatpadakodeberikut.
varfruits=make([]string,2)fruits[0]="apple"fruits[1]="manggo"
fmt.Println(fruits)//[applemanggo]
Array
57
-
Parameterpertamakeywordtersebutdiisidengantipedataarrayyangakandibuat,parameterkeduaadalahjumlahelemennya.Padakodediatas,variabelfruitstercetaksebagaiarraystringdenganalokasi2slot.
Array
58
-
SliceSliceadalahreferensielemenarray.Slicebisadibuat,ataubisajugadihasilkandarimanipulasisebuaharrayataupunslicelainnya.Karenamerupakanreferensi,menjadikanperubahandataditiapelemensliceakanberdampakpadaslicelainyangmemilikialamatmemoriyangsama.
InisialisasiSliceCaramembuatslicemiripsepertipadaarray,bedanyatidakperlumendefinisikanjumlahelemenketikaawaldeklarasi.Pengaksesannilaielemen-nyajugasama.Kodeberikutadalahcontohpembuatanslice.
varfruits=[]string{"apple","grape","banana","melon"}fmt.Println(fruits[0])//"apple"
Salahsatuperbedaanslicedanarraybisadiketahuipadasaatdeklarasivariabel-nya,jikajumlahelementidakdituliskan,makavariabeltersebutadalahslice.
varfruitsA=[]string{"apple","grape"}//slicevarfruitsB=[2]string{"banana","melon"}//arrayvarfruitsC=[...]string{"papaya","grape"}//array
HubunganSliceDenganArray&OperasiSliceKalauperbedannyahanyadipenentuanalokasipadasaatinisialisasi,kenapatidakmenggunakansatuistilahsaja?atauadakahperbedaanlainnya?
Sebenarnyaslicedanarraytidakbisadibedakankarenamerupakansebuahkesatuan.Arrayadalahkumpulannilaiatauelemen,sedangsliceadalahreferensitiapelementersebut.
Slicebisadibentukdariarrayyangsudahdidefinisikan,caranyadenganmemanfaatkanteknik2indexuntukmengambilelemen-nya.Contohbisadilihatpadakodeberikut.
Slice
59
-
varfruits=[]string{"apple","grape","banana","melon"}varnewFruits=fruits[0:2]
fmt.Println(newFruits)//["apple","grape"]
Kodefruits[0:2]maksudnyaadalahpengaksesanelemendalamslicefruitsyangdimulaidariindekske-0,hinggasebelumindekske-2.Elemenyangmemenuhikriteriatersebutkemudiandikembalikan,untukdisimpanpadavariabelsebagaislicebaru.Padacontohdiatas,newFruitsadalahslicebaruyangtercetakdarislicefruits,denganisi2elemen,yaitu"apple"dan"grape".
Ketikamengakseselemenarraymenggunakansatubuahindeks(sepertidata[2]),nilaiyangdidapatmerupakanhasilcopydarireferensiaslinya.Pengaksesanelemenlewat2buahindeks(sepertidata[0:2]),mengembalikansliceatauelemenreferensi.
Tabelberikutadalahlistoperasioperasimenggunakanteknik2indeksyangbisadilakukan.
varfruits=[]string{"apple","grape","banana","melon"}
Kode Output Penjelasan
fruits[0:2] [apple,grape] semuaelemenmulaiindekske-0,hinggasebelumindekske-2
fruits[0:4] [apple,grape,banana,melon] semuaelemenmulaiindekske-0,hinggasebelumindekske-4
fruits[0:0] []menghasilkanslicekosong,karenatidakadaelemensebelumindekske-0
fruits[4:4] []menghasilkanslicekosong,karenatidakadaelemenyangdimulaidariindekske-4
fruits[4:0] []error,padapenulisanfruits[a,b]nilaiaharuslebihbesaratausamadenganb
fruits[:] [apple,grape,banana,melon] semuaelemen
fruits[2:] [banana,melon] semuaelemenmulaiindekske-2
fruits[:2] [apple,grape] semuaelemenhinggasebelumindekske-2
Slice
60
-
SliceMerupakanTipeDataReferenceSlicemerupakantipereference.Artinyajikaadaslicebaruyangterbentukdarislicelama,makaelemenslicebarumemilikireferensiyangsamadenganelemenslicelama.Setiapperubahanyangterjadidielemenslicebaru,akanberdampakjugapadaelemenslicelamayangmemilikireferensiyangsama.
Programberikutmerupakanpembuktiantentangteoriyangbarukitabahas.Kitaakanmencobamengubahdataelemenslicebaru,yangterbentukdarislicelama.
varfruits=[]string{"apple","grape","banana","melon"}
varaFruits=fruits[0:3]varbFruits=fruits[1:4]
varaaFruits=aFruits[1:2]varbaFruits=bFruits[0:1]
fmt.Println(fruits)//[applegrapebananamelon]fmt.Println(aFruits)//[applegrapebanana]fmt.Println(bFruits)//[grapebananamelon]fmt.Println(aaFruits)//[grape]fmt.Println(baFruits)//[grape]
//Buah"grape"diubahmenjadi"pinnaple"baFruits[0]="pinnaple"
fmt.Println(fruits)//[applepinnaplebananamelon]fmt.Println(aFruits)//[applepinnaplebanana]fmt.Println(bFruits)//[pinnaplebananamelon]fmt.Println(aaFruits)//[pinnaple]fmt.Println(baFruits)//[pinnaple]
VariabelaFruits,bFruitsmerupakanslicebaruyangterbentukdarivariabelfruits.Denganmenggunakanduaslicebarutersebut,diciptakanlagislicelainnya,yaituaaFruits,danbaFruits.Kelimaslicetersebutditampilkannilainya.
Selanjutnya,nilaidaribaFruits[0]diubah,dan5slicetadiditampilkanlagi.Hasilnyaakanadabanyaksliceyangelemennyaikutberubah.Yaituelemen-elemenyangreferensi-nyasamadenganreferensielemenbaFruits[0].
Slice
61
-
Bisadilihatpadaoutputdiatas,elemenyangsebelumnyabernilai"grape"padavariabelfruits,aFruits,bFruits,aaFruits,danbaFruits;kesemuanyaberubahmenjadi"pinnaple",karenamemilikireferensiyangsama.
AdabeberapabuiltinfunctionbawaanGolang,yangbisadimanfaatkanuntukkeperluanoperasislice.Berikutadalahpembahasanmengenaifungsi-fungsitersebut.
Fungsilen()Fungsilen()digunakanuntukmenghitunglebarsliceyangada.Sebagaicontohjikasebuahvariabeladalahslicedengandata4buah,makafungsiinipadavariabeltersebutakanmengembalikanangka4,yangangkatersebutdidapatdarijumlahelemenyangada.Contohpenerapannyabisadilihatdikodeberikut
varfruits=[]string{"apple","grape","banana","melon"}fmt.Println(len(fruits))//4
Fungsicap()Fungsicap()digunakanuntukmenghitunglebarmaksimum/kapasitasslice.Nilaikembalianfungsiiniawalnyasamadenganlen,tapibisaberubahtergantungdarioperasisliceyangdilakukan.Agarlebihjelas,silakandisimakkodeberikut.
Slice
62
-
varfruits=[]string{"apple","grape","banana","melon"}fmt.Println(len(fruits))//len:4fmt.Println(cap(fruits))//cap:4
varaFruits=fruits[0:3]fmt.Println(len(aFruits))//len:3fmt.Println(cap(aFruits))//cap:4
varbFruits=fruits[1:4]fmt.Println(len(bFruits))//len:3fmt.Println(cap(bFruits))//cap:3
Variabelfruitsdisiapkandiawaldenganjumlahelemen4.Makafungsilen(fruits)dancap(fruits)akanmenghasilkanangka4.
VariabelaFruitsdanbFruitsmerupakanslicebaruberisikan3buahelemenmilikslicefruits.VariabelaFruitsmengambilelemenindex0,1,2;sedangkanbFruits1,2,3.
Fungsilen()menghasilkanangka3,karenajumlahelemenkeduasliceiniadalah3.Tetapicap(aFruits)menghasilkanangkayangberbeda,yaitu4untukaFruitsdan3untukbFruits.kenapa?jawabannyabisadilihatpadatabelberikut.
Kode Output len() cap()
fruits[0:4] [buahbuahbuahbuah] 4 4
aFruits[0:3] [buahbuahbuah----] 3 4
bFruits[1:3] ----[buahbuahbuah] 3 3
Slicingyangdimulaidariindeks0hinggaxakanmengembalikanelemen-elemenmulaiindeks0hinggasebelumindeksx,denganlebarkapasitasadalahsamadengansliceaslinya.Sedangkanslicingyangdimulaidariindeksy,yangdimananilaiyadalahlebihdari0,membuatelemenke-ysliceyangdiambilmenjadielemenke-0slicebaru.Halinilahyangmembuatkapasitassliceberubah.
Fungsiappend()Fungsiappend()digunakanuntukmenambahkanelemenpadaslice.Elemenbarutersebutdiposisikansetelahindekspalingakhir.Nilaibalikfungsiiniadalahsliceyangsudahditambahkannilaibarunya.Contohpenggunaannyabisadilihatdikodeberikut.
Slice
63
-
varfruits=[]string{"apple","grape","banana"}varcFruits=append(fruits,"papaya")
fmt.Println(fruits)//["apple","grape","banana"]fmt.Println(cFruits)//["apple","grape","banana","papaya"]
Ada3halyangperludiketahuidalampenggunaanfungsiini.
Ketikajumlahelemendanlebarkapasitasadalahsama(len(fruits)==cap(fruits)),makaelemenbaruhasilappend()merupakanreferensibaru.Ketikajumlahelemenlebihkecildibandingkapasitas(len(fruits)<cap(fruits)),elemenbarutersebutditempatkankedalamcakupankapasitas,menjadikansemuaelemenslicelainyangreferensi-nyasamaakanberubahnilainya.
Agarlebihjelassilakanperhatikancontohberikut.
varfruits=[]string{"apple","grape","banana"}varbFruits=fruits[0:2]
fmt.Println(cap(bFruits))//3fmt.Println(len(bFruits))//2
fmt.Println(fruits)//["apple","grape","banana"]fmt.Println(bFruits)//["apple","grape"]
varcFruits=append(bFruits,"papaya")
fmt.Println(fruits)//["apple","grape","papaya"]fmt.Println(bFruits)//["apple","grape"]fmt.Println(cFruits)//["apple","grape","papaya"]
Padacontohdiatasbisadilihat,elemenindekske-2slicefruitsnilainyaberubahsetelahadapenggunaankeywordappend()padabFruits.SlicebFruitskapasitasnyaadalah3sedangjumlahdatanyahanya2.Karenalen(bFruits)<cap(bFruits),makaelemenbaruyangdihasilkan,terdeteksisebagaiperubahannilaipadareferensiyanglama(referensielemenindekske-2slicefruits),membuatelemenyangreferensinyasama,nilainyaberubah.
Fungsicopy()Fungsicopy()digunakanuntukmen-copyelemenslicetujuan(parameterke-2),untukdigabungkandenganslicetarget(parameterke-1).Fungsiinimengembalikanjumlahelemenyangberhasildi-copy(yangnilaitersebutmerupakannilaiterkecilantaralen(sliceTarget)danlen(sliceTujuan)).Berikutmerupakancontohpenerapannya.
Slice
64
-
varfruits=[]string{"apple"}varaFruits=[]string{"watermelon","pinnaple"}
varcopiedElemen=copy(fruits,aFruits)
fmt.Println(fruits)//["apple","watermelon","pinnaple"]fmt.Println(aFruits)//["watermelon","pinnaple"]fmt.Println(copiedElemen)//1
PengaksesanElemenSliceDengan3Indeks3indexadalahteknikslicingelemenyangsekaligusmenentukankapasitasnya.Caramenggunakannnyayaitudenganmenyisipkanangkakapasitasdibelakang,sepertifruits[0:1:1].Angkakapasitasyangdiisikantidakbolehmelebihikapasitassliceyangakandislicing.
Berikutmerupakancontohpenerapannya.
varfruits=[]string{"apple","grape","banana"}varaFruits=fruits[0:2]varbFruits=fruits[0:2:2]
fmt.Println(fruits)//["apple","grape","banana"]fmt.Println(len(fruits))//len:3fmt.Println(cap(fruits))//cap:3
fmt.Println(aFruits)//["apple","grape"]fmt.Println(len(aFruits))//len:2fmt.Println(cap(aFruits))//cap:3
fmt.Println(bFruits)//["apple","grape"]fmt.Println(len(bFruits))//len:2fmt.Println(cap(bFruits))//cap:2
Slice
65
-
MapMapadalahtipedataasosiatifyangadadiGolang.Bentuknyakey-value,artinyasetiapdata(atauvalue)yangdisimpan,disiapkanjugakey-nya.Keytersebutharusunik,karenadigunakansebagaipenanda(atauidentifier)untukpengaksesandataatauitemyangtersimpan.
Kalaudilihat,mapmiripsepertislice,hanyasajaindeksyangdigunakanuntukpengaksesanbisaditentukansendiritipe-nya(indekstersebutadalahkey).
PenggunaanMapCaramenggunakanmapadalahdenganmenuliskankeywordmapdiikutitipedatakeydanvalue-nya.Agarlebihmudahdipahami,silakanperhatikancontohdibawahini.
varchickenmap[string]intchicken=map[string]int{}
chicken["januari"]=50chicken["februari"]=40
fmt.Println("januari",chicken["januari"])//januari50fmt.Println("mei",chicken["mei"])//mei0
Variabelchickendideklarasikansebagaimap,dengantipedatakeyadalahstringdanvalue-nyaint.Darikodetersebutbisadilihatbagaimanacarapenggunaankeywordmap.map[string]intmaknanyaadalahtipedatamapdengankeybertipestringdanvaluebertipeint.
Defaultnilaivariabelmapadalahnil.Olehkarenaituperludilakukaninisialisasinilaidefaultdiawal,caranyacukupdengantambahkankurungkurawalpadaakhirtipe,contohsepertipadakodediatas:map[string]int{}.
Caramenge-setnilaivariabelmapcukupmudah,tinggalpanggilvariabel-nya,sisipkankeypadakurungsikuvariabel(miripseperticarapengaksesanelemenslice),laluisinilainya,contohnyasepertichicken["februari"]=40.Sedangkancarapengambilanvalueadalahcukupdenganmenyisipkankeypadakurungsikuvariabel.
Pengisiandatapadamapbersifatoverwrite,ketikavariabelsudahmemilikiitemdengankeyyangsama,makavalue-nyaakanditimpadenganyangbaru.
Map
66
-
Padapengaksesanitemmenggunakankeyyangbelumtersimpandimap,akandikembalikannilaidefaulttipedatavalue-nya.Contohnyasepertipadakodediatas,chicken["mei"]menghasilkannilai0(nilaidefaulttipeint),karenabelumadaitemyangtersimpanmenggunakankey"mei".
InisialisasiNilaiMapNilaivariabelbertipemapbisadidefinisikandiawal,caranyadenganmenambahkankurungkurawalsetelahtipedata,lalumenuliskankeydanvaluedidalamnya.Carainisekilasmiripdengandefinisinilaiarray/slicenamundalambentukkey-value.
//caravertikalvarchicken1=map[string]int{"januari":50,"februari":40}
//carahorizontalvarchicken2=map[string]int{"januari":50,"februari":40,}
Keydanvaluedituliskandenganpembatastandatitikdua(:).Sedangkantiapitemnyadituliskandenganpembatastandakoma(,).Khususdeklarasidengangayavertikal,tandakomaperludituliskansetelahitemterakhir.
Variabelmapbisadiinisialisasidengantanpanilaiawal,caranyacukupmenggunakantandakurungkurawal,contoh:map[string]int{}.Ataubisajugadenganmenggunakankeywordmakedannew.Contohnyabisadilihatpadakodeberikut.Ketigacaradibawahiniintinyaadalahsama.
varchicken3=map[string]int{}varchicken4=make(map[string]int)varchicken5=*new(map[string]int)
Khususinisialisasidatamenggunakankeywordnew,yangdihasilkanadalahdatapointer.Untukmengambilnilaiaslinyabisadenganmenggunakantandaasterisk(*).Topikpointerakandibahaslebihdetailketikasudahmasukbab22.
IterasiItemMapMenggunakanfor-range
Map
67
-
Itemvariabelmapbisadiiterasimenggunakanfor-range.Carapenerapannyamasihsamasepertipadaslice,pembedanyadatayangdikembalikanditiapperulanganadalahkeydanvalue,bukanindeksdanelemen.Contohnyabisadilihatdikodeberikut.
varchicken=map[string]int{"januari":50,"februari":40,"maret":34,"april":67,}
forkey,val:=rangechicken{fmt.Println(key,"\t:",val)}
MenghapusItemMapFungsidelete()digunakanuntukmenghapusitemdengankeytertentupadavariabelmap.Carapenggunaannya,denganmemasukanobjekmapdankeyitemyangingindihapussebagaiparameter.
varchicken=map[string]int{"januari":50,"februari":40}
fmt.Println(len(chicken))//2fmt.Println(chicken)
delete(chicken,"januari")
fmt.Println(len(chicken))//1fmt.Println(chicken)
Itemyangmemilikikey"januari"dalamvariabelchickenakandihapus.
Fungsilen()jikadigunakanpadamapakanmengembalikanjumlahitem.
Map
68
-
DeteksiKeberadaanItemDenganKeyTertentuAdacarauntukmengetahuiapakahdalamsebuahvariabelmapterdapatitemdengankeytertentuatautidak,yaitudenganmemanfaatkan2variabelsebagaipenampungnilaikembalianpengaksesanitem.Variabelke-2akanberisikannilaiboolyangmenunjukkanadaatautidaknyaitemyangdicari.
varchicken=map[string]int{"januari":50,"februari":40}varvalue,isExist=chicken["mei"]
ifisExist{fmt.Println(value)}else{fmt.Println("itemisnotexists")}
KombinasiSlice&MapSlicedanmapbisadikombinasikan,danseringdigunakanpadabanyakkasus,contohnyasepertidataarrayyangberisikaninformasisiswa,danbanyaklainnya.
Caramenggunakannyacukupmudah,contohnyaseperti[]map[string]int,artinyasliceyangtipetiapelemen-nyaadalahmap[string]int.
Agarlebihjelas,silakanpraktekancontohberikut.
varchickens=[]map[string]string{map[string]string{"name":"chickenblue","gender":"male"},map[string]string{"name":"chickenred","gender":"male"},map[string]string{"name":"chickenyellow","gender":"female"},}
for_,chicken:=rangechickens{fmt.Println(chicken["gender"],chicken["name"])}
Variabelchickensdiatasberisikaninformasibertipemap[string]string,yangkebetulantiapelemenmemiliki2keyyangsama.
Jikaandamenggunakanversigoterbaru,caradeklarasislice-mapbisadipersingkat,tipetiapelementidakwajibuntukdituliskan.
Map
69
-
varchickens=[]map[string]string{{"name":"chickenblue","gender":"male"},{"name":"chickenred","gender":"male"},{"name":"chickenyellow","gender":"female"},}
Dalam[]map[string]string,tiapelemenbisasajamemilikikeyyangberbeda-beda,sebagaicontohsepertikodeberikut.
vardata=[]map[string]string{{"name":"chickenblue","gender":"male","color":"brown"},{"address":"manggastreet","id":"k001"},{"community":"chickenlovers"}}
Map
70
-
FungsiFungimerupakanaspekpentingdalampemrograman.Definisifungsisendiriadalahsekumpulanblokkodeyangdibungkusdengannamatertentu.Penerapanfungsiyangtepatakanmenjadikankodelebihmodulardanjugadry(kependekandaridon'trepeatyourself),karenatakperlumenuliskanbanyakprosesberkali-kali,cukupsekalisajadantinggalpanggiljikadibutuhkan.
DibabinikitaakanbelajartentangpenggunaanfungsidiGolang.
PenerapanFungsiSebenarnyatanpasadar,kitasudahmenerapkanfungsidibab-babsebelumini,yaitupadafungsimain.FungsimainmerupakanfungsiyangpalingutamapadaprogramGolang.
Caramembuatfungsicukupmudah,yaitudenganmenuliskankeywordfunc,diikutisetelahnyanamafungsi,kurungyangberisikanparameter,dankurungkurawaluntukmembungkusblokkode.
Parametersendiriadalahvariabelyangdisisipkanpadasaatpemanggilanfungsi.
Berikutadalahcontohpenerapanfungsi.
packagemain
import"fmt"import"strings"
funcmain(){varnames=[]string{"John","Wick"}printMessage("halo",names)}
funcprintMessage(messagestring,arr[]string){varnameString=strings.Join(arr,"")fmt.Println(message,nameString)}
Padakodediatas,fungsibarudibuatdengannamaprintMessagememiliki2buahparameteryaitustringmessagedanslicestringarr.
Fungsi
71
-
Fungsitersebutdipanggildalammain,dengandisisipkan2buahdatasebagaiparameter,datapertamaadalahstring"hallo"yangditampungparametermessage,danslicestringnamesyangnilainyaditampungolehparameterarr.
DidalamprintMessage,nilaiarryangmerupakanslicestringdigabungkanmenjadisebuahstringdenganpembatasadalahkarakterspasi.Penggabunganslicedapatdilakukandenganmemanfaatkanfungsistrings.Join().Fungsiiniberadadidalampackagestrings.
FungsiDenganReturnValue/NilaiBalikSebuahfungsibisadidesaintidakmengembalikanapa-apa(void),ataubisamengembalikansuatunilai.Fungsiyangmemilikinilaikembalian,harusditentukantipedatanilaibaliknyapadasaatdeklarasi.
Programberikutmerupakancontohpenerapanfungsiyangmemilikireturnvalue.
packagemain
import("fmt""math/rand""time")
funcmain(){rand.Seed(time.Now().Unix())varrandomValueint
randomValue=randomWithRange(2,10)fmt.Println("randomnumber:",randomValue)randomValue=randomWithRange(2,10)fmt.Println("randomnumber:",randomValue)randomValue=randomWithRange(2,10)fmt.Println("randomnumber:",randomValue)}
funcrandomWithRange(min,maxint)int{varvalue=rand.Int()%(max-min+1)+minreturnvalue}
Fungsi
72
-
DidalamfungsirandomWithRangeterdapatprosesgenerateangkaacak,yangangkatersebutkemudiandigunakansebagainilaikembalian.
Caramenentukantipedatanilaibalikfungsiadalahdenganmenuliskantipedatayangdiinginkansetelahkurungparameter.Bisadilihatpadakodediatas,bahwaintmerupakantipedatanilaibalikfungsirandomWithRange.
funcrandomWithRange(min,maxint)int
Sedangkancarauntukmengembalikannilainyaadalahdenganmenggunakankeywordreturndiikutidatayangingindikembalikan.Padacontohdiatas,returnvalueartinyanilaivariabelvaluedijadikannilaikembalianfungsi.
Eksekusikeywordreturnakanmenjadikanprosesdalamblokfungsiberhentipadasaatitujuga.Semuastatementsetelahkeywordtersebuttidakakandieksekusi.
Darikodediatasmungkinadabeberapastatementyangmasihterasaasing,berikutmerupakanpembahasannya.
PenggunaanFungsirand.Seed()Fungsiinidiperlukanuntukmemastikanbahwaangkarandomyangakandi-generatebenar-benaracak.Kitabisagunakanangkaapasajasebagainilaiparameterfungsiini(umumnyadiisitime.Now().Unix()).
rand.Seed(time.Now().Unix())
Fungsirand.Seed()beradadalampackagemath/rand,yangharusdi-importterlebihdahulusebelumbisadimanfaatkan.
Packagetimejugaperludi-importkarenakitamenggunakanfungsi(time.Now().Unix())disitu.
ImportBanyakPackage
Fungsi
73
-
Penulisankeywordimportuntukbanyakpackagebisadilakukandenganduacara,denganmenuliskannyaditiappackage,ataucukupsekalisaja.Contohnyabisadilihatdikodeberikut.
import"fmt"import"math/rand"import"time"
//atau
import("fmt""math/rand""time")
Pilihcarayangterasanyamandihati.
DeklarasiParameterBertipeDataSamaKhususuntukfungsiyangtipedataparameternyasama,bisaditulisdengangayayangunik.Tipedatanyadituliskancukupsekalisajadiakhir.Contohnyabisadilihatpadakodeberikut.
funcnameOfFunc(paramAtype,paramBtype,paramCtype)returnTypefuncnameOfFunc(paramA,paramB,paramCtype)returnType
funcrandomWithRange(minint,maxint)intfuncrandomWithRange(min,maxint)int
PenggunaanKeywordreturnUntukMenghentikanProsesDalamFungsiSelainsebagaipenandanilaibalik,keywordreturnjugabisadimanfaatkanuntukmenghentikanprosesdalamblokfungsidimanaiadipakai.Contohnyabisadilihatpadakodeberikut.
Fungsi
74
-
packagemain
import"fmt"
funcmain(){divideNumber(10,2)divideNumber(4,0)divideNumber(8,-4)}
funcdivideNumber(m,nint){ifn==0{fmt.Printf("invaliddivider.%dcannotdividedby%d\n",m,n)return}
varres=m/nfmt.Printf("%d/%d=%d\n",m,n,res)}
FungsidivideNumberdidesaintidakmemilikinilaibalik.Fungsiinidibuatuntukmembungkusprosespembagian2bilangan,lalumenampilkanhasilnya.
Didalamnyaterdapatprosesvalidasinilaivariabelpembagi,jikanilainyaadalah0,makaakanditampilkanpesanbahwapembagiantidakbisadilakukan,laluprosesdihentikanpadasaatitujuga(denganmemanfaatkankeywordreturn).Jikanilaipembagivalid,makaprosespembagianditeruskan.
Fungsi
75
-
FungsiMultipleReturnUmumnyafungsihanyamemilikisatubuahnilaibaliksaja.Jikaadakebutuhandimanadatayangdikembalikanharusbanyak,biasanyadigunakanlahtipesepertimap,slice,ataustructsebagainilaibalik.
Golangmenyediakankapabilitasbagiprogrammeruntukmembuatfungsimemilikibanyaknilaibalik.Dibabiniakandibahasbagaimanapenerapannya.
PenerapanFungsiMultipleReturnCaramembuatfungsiyangmemilikibanyaknilaibaliktidaklahsulit.Tinggaltulissajapadasaatdeklarasifungsisemuatipedatanilaiyangdikembalikan,danpadakeywordreturntulissemuadatayangingindikembalikan.Contohbisadilihatpadaberikut.
packagemain
import"fmt"import"math"
funccalculate(dfloat64)(float64,float64){//hitungluasvararea=math.Pi*math.Pow(d/2,2)//hitungkelilingvarcircumference=math.Pi*d
//kembalikan2nilaireturnarea,circumference}
Fungsicalculate()diatasmenerimasatubuahparameter(diameter)yangdigunakandalamprosesperhitungan.Didalamfungsitersebutada2halyangdihitung,yaitunilaikelilingdanlingkaran.Keduanilaitersebutkemudiandijadikansebagaireturnvaluefungsi.
Carapendefinisianbanyaknilaibalikbisadilihatpadakodediatas,yaitudenganlangsungmenuliskantipe-tipedatanilaibalikdenganpemisahtandakoma,danditambahkankurungdiantaranya.
funccalculate(dfloat64)(float64,float64)
FungsiMultipleReturn
76
-
Taklupadibagianpenulisankeywordreturnharusdituliskanjugasemuadatayangdijadikannilaibalik(denganpemisahtandakoma).
returnarea,circumference
Implementasidarifungsicalculate()diatas,bisadilihatpadakodeberikut.
funcmain(){vardiameterfloat64=15vararea,circumference=calculate(diameter)
fmt.Printf("luaslingkaran\t\t:%.2f\n",area)fmt.Printf("kelilinglingkaran\t:%.2f\n",circumference)}
Outputprogram:
Karenafungsitersebutmemilikibanyaknilaibalik,makapadapemanggilannyaharusdisiapkanjugabanyakvariabeluntukmenampungnilaikembalianyangada(sesuaijumlahnilaibalikfungsi).
vararea,circumference=calculate(diameter)
Adabeberapahalbarudarikodediatasyangperludibahas,sepertimath.Pow()danmath.Pi.Berikutadalahpenjelasannya.
PenggunaanFungsimath.Pow()Fungsimath.Pow()digunakanuntukmemangkatnilai.math.Pow(2,3)berarti2pangkat3,hasilnya8.Fungsiiniberadadalampackagemath.
PenggunaanKonstantamath.Pimath.PiadalahkonstantabawaanpackagemathyangmerepresentasikanPiatau22/7.
FungsiMultipleReturn
77
-
FungsiMultipleReturn
78
-
FungsiVariadicGolangmengadopsikonsepvariadicfunctionataupembuatanfungsidenganparametersejenisyangtakterbatas.Maksudtakterbatasdisiniadalahjumlahparameteryangdisisipkanketikapemanggilanfungsibisaberapasaja.
Parametervariadicmemilikisifatyangmiripdenganslice.Nilaiparameter-parameteryangdisisipkanmemilikitipedatayangsama,danakanditampungolehsebuahvariabelsaja.Carapengaksesantiapdatanyajugasama,denganmenggunakanindeks.
Dibabinikitaakanbelajarmengenaicarapenerapanfungsivariadic.
PenerapanFungsiVariadicDeklarasiparametervariadicsamadengancaradeklarasivariabelbiasa,pembedanyapadaparameterjenisiniditambahkantanda3titik(...)setelahpenulisanvariabel(sebelumtipedata).Nantinyasemuanilaiyangdisisipkansebagaiparameterakanditampungolehvariabeltersebut.
Berikutmerupakancontohpenerepannya.
packagemain
import"fmt"
funcmain(){varavg=calculate(2,4,3,5,4,3,3,5,5,3)varmsg=fmt.Sprintf("Rata-rata:%.2f",avg)fmt.Println(msg)}
funccalculate(numbers...int)float64{vartotalint=0for_,number:=rangenumbers{total+=number}
varavg=float64(total)/float64(len(numbers))returnavg}
Outputprogram:
FungsiVariadic
79
-
Bisadilihatpadafungsicalculate(),parameternumbersdideklarasikandengandisisipkantanda3titik(...)sebelumpenulisantipedata-nya.Menandakanbahwanumbersadalahsebuahparametervariadicdengantipedataint.
funccalculate(numbers...int)float64{
Padapemanggilanfungsidisisipkanbanyakparametersesuaikebutuhan.
varavg=calculate(2,4,3,5,4,3,3,5,5,3)
Nilaitiapparameterbisadiaksesseperticarapengaksesantiapelemenslice.Padacontohdiatasmetodeyangdipilihadalahfor-range.
for_,number:=rangenumbers{
Berikutmerupakanpenjelasantambahanmengenaibeberapakodediatas.
PenggunaanFungsifmt.Sprintf()Fungsifmt.Sprintf()padadasarnyasamadenganfmt.Printf(),hanyasajafungsiinitidakmenampilkannilai,melainkanmengembalikannilainyadalambentukstring.Padakasusdiatas,nilaihasilfmt.Sprintf()ditampungolehvariabelmsg.
Selainfmt.Sprintf(),adajugafmt.Sprint()danfmt.Sprintln().
PenggunaanFungsifloat64()Sebelumnyasudahdibahasbahwafloat64merupakantipedata.Tipedatajikaditulissebagaifungsi(penandanyaadatandakurungnya)bergunauntukcasting.Castingsendiriadalahteknikuntukkonversitipesebuahdataketipelain.Hampirsemuajenistipedatadasaryangtelahdipelajaridibab9bisadigunakanuntukcasting.Dancarapenerepannyajugasama,cukuppanggilsebagaifungsi,lalumasukandatayangingindikonversisebagaiparameter.
Padacontohdiatas,variabeltotalyangtipenyaadalahint,dikonversimenjadifloat64,begitujugalen(numbers)yangmenghasilkanintdikonversikefloat64.
FungsiVariadic
80
-
Variabelavgperludijadikanfloat64karenapenghitunganrata-ratalebihseringmenghasilkannilaidesimal.
Operasibilangan(perkalian,pembagian,danlainnya)diGolanghanyabisadilakukanjikatipedatanyasejenis.Makadariitulahperluadanyacastingketipefloat64padatiapoperand.
PengisianFungsiVariadicMenggunakanDataSliceSlicebisadigunakansebagaiparametervariadic.Caranyacukupmudah,yaitudenganmenambahkantanda3titiksetelahnamavariabelketikamemasukannyakeparameter.Contohnyabisadilihatpadakodeberikut.
varnumbers=[]int{2,4,3,5,4,3,3,5,5,3}varavg=calculate(numbers...)varmsg=fmt.Sprintf("Rata-rata:%.2f",avg)
fmt.Println(msg)
Padakodediatas,variabelnumbersyangmerupakansliceint,disisipkankefungsicalculate()sebagaiparametervariadic(bisadilihattanda3titiksetelahpenulisanvariabel).Teknikinisangatbergunaketikasebuahdatasliceingindifungsikansebagaiparametervariadic.
Perhatikanjugakodeberikutini.Intinyaadalahsama,hanyacaranyayangberbeda.
varnumbers=[]int{2,4,3,5,4,3,3,5,5,3}varavg=calculate(numbers...)
//atau
varavg=calculate(2,4,3,5,4,3,3,5,5,3)
Padadeklarasiparameterfungsivariadic,tanda3titik(...)dituliskansebelumtipedataparameter.Sedangkanpadapemanggilanfungsidenganmenyisipkanparameterarray,tandatersebutdituliskandibelakangvariabelnya.
FungsiDenganParameterBiasa&Variadic
FungsiVariadic
81
-
Parametervariadicbisadikombinasikandenganparameterbiasa,dengansyaratparametervariadic-nyaharusdiposisikandiakhir.Contohnyabisadilihatpadakodeberikut.
import"fmt"import"strings"
funcyourHobbies(namestring,hobbies...string){varhobbiesAsString=strings.Join(hobbies,",")
fmt.Printf("Hello,mynameis:%s\n",name)fmt.Printf("Myhobbiesare:%s\n",hobbiesAsString)}
NilaiparameterpertamafungsiyourHobbies()akanditampungolehname,sedangkannilaiparameterkeduadanseterusnyaakanditampungolehhobbiessebagaislice.
Carapemanggilannyamasihsamaseperipadafungsibiasa.Contohnyabisadilihatpadakodeberikut.
funcmain(){yourHobbies("wick","sleeping","eating")}
Jikaparameterkeduadanseterusnyaingindiisidengandatadarislice,makagunakantanda3titik.Contoh:
funcmain(){varhobbies=[]string{"sleeping","eating"}yourHobbies("wick",hobbies...)}
Outputprogram:
FungsiVariadic
82
-
FungsiClosureDefinisitermudahClosureadalahsebuahfungsiyangbisadisimpandalamvariabel.Denganmenerapkankonseptersebut,sangatmungkinuntukmembuatfungsididalamfungsi,ataubahkanmembuatfungsiyangmengembalikanfungsi.
Closuremerupakananonymousfunctionataufungsitanpanama.Biasadimanfaatkanuntukmembungkussuatuprosesyanghanyadipakaisekaliataudipakaipadabloktertentusaja.
ClosureDisimpanSebagaiVariabelSebuahfungsitanpanamabisadisimpandalamvariabel.Variabelyangmenyimpanclosurememilikisifatsepertifungsiyangdisimpannya.Dibawahiniadalahcontohprogramsederhanauntukmencarinilaiterendahdantertinggidarisuatuarray.LogikapencariandibungkusdalamclosureyangditampungolehvariabelgetMinMax.
packagemain
import"fmt"
funcmain(){vargetMinMax=func(n[]int)(int,int){varmin,maxintfori,e:=rangen{switch{casei==0:max,min=e,ecasee>max:max=ecasee<min:min=e}}returnmin,max}
varnumbers=[]int{2,3,4,3,4,2,3}varmin,max=getMinMax(numbers)fmt.Printf("data:%v\nmin:%v\nmax:%v\n",numbers,min,max)}
FungsiClosure
83
-
Bisadilihatpadakodediatasbagiamanacaraclosuredibuatdandipanggil.Sedikitberbedamemangdibandingpembuatanfungsibiasa.Fungsiditulistanpanama,laluditampungdalamvariabel.
vargetMinMax=func(n[]int)(int,int){//...}
Carapemanggilannya,denganmenuliskannamavariabeltersebutsebagaifungsi(sepertipemanggilanfungsibiasa).
varmin,max=getMinMax(numbers)
Outputprogram:
Berikutadalahpenjelasantambahanmengenaikodediatas
PenggunaanTemplateString%vTemplate%vdigunakanuntukmenampilkansegalajenisdata.Bisaarray,int,float,bool,danlainnya.
fmt.Printf("data:%v\nmin:%v\nmax:%v\n",numbers,min,max)
Bisadilihatpadastatementdiatas,databertipearraydannumerikditampilkanmenggunakan%v.Templateinibiasadimanfaatkanuntukmenampilkansebuahdatayangtipenyabisadinamisataubelumdiketahui.Sangattepatjikadigunakanpadadatabertipeinterface{}yangnantinyaakandibahaspadabab27.
Immediately-InvokedFunctionExpression(IIFE)
FungsiClosure
84
-
Closurejenisinidieksekusilangsungpadasaatdeklarasinya.Biasadigunakanuntukmembungkusprosesyanghanyadilakukansekali,bisamengembalikannilai,bisajugatidak.
DibawahinimerupakancontohsederhanapenerapanmetodeIIFEuntukfilteringdataarray.
packagemain
import"fmt"
funcmain(){varnumbers=[]int{2,3,0,4,3,2,0,4,2,0,3}
varnewNumbers=func(minint)[]int{varr[]intfor_,e:=rangenumbers{ife<min{continue}r=append(r,e)}returnr}(3)
fmt.Println("originalnumber:",numbers)fmt.Println("filterednumber:",newNumbers)}
Outputprogram:
CirikhasIIFEadalahadanyakurungparametertepatsetelahdeklarasiclosureberakhir.Jikaadaparameter,bisajugadituliskandalamkurungparameternya.
varnewNumbers=func(minint)[]int{//...}(3)
PadacontohdiatasIIFEmenghasilkannilaibalikyangkemudianditampungnewNumber.Perludiperhatikanbahwayangditampungadalahnilaikembaliannyabukanclosure-nya.
FungsiClosure
85
-
Closurebisajugadengangayamanifesttyping,caranyadenganmenuliskanskemaclosure-nyasebagaitipedata.Contoh:varclosure(func(string,int,[]string)int)closure=func(astring,bint,c[]string)int{//..}
ClosureSebagaiNilaiKembalianSalahsatukeunikanclosurelainnyaadalahbisadijadikansebagainilaibalikfungsi,cukupanehmemang,tapipadasuatukondisiteknikinisangatmembantu.DibawahinidisiapkansebuahfungsibernamafindMax()yangmemilikisalahsatunilaikembalianberupaclosure.
packagemain
import"fmt"
funcfindMax(numbers[]int,maxint)(int,func()[]int){varres[]intfor_,e:=rangenumbers{ife
-
SedikittentangfungsifindMax(),fungsiinidigunakanuntukmencaribanyaknyaangka-angkayangnilainyadibawahatausamadenganangkatertentu.Nilaikembalianpertamaadalahjumlahangkanya.Nilaikembaliankeduaberupaclosureyangmengembalikanangka-angkayangdicari.Berikutmerupakancontohimplementasifungsitersebut.
funcmain(){varmax=3varnumbers=[]int{2,3,0,4,3,2,0,4,2,0,3}varhowMany,getNumbers=findMax(numbers,max)vartheNumbers=getNumbers()
fmt.Println("numbers\t:",numbers)fmt.Printf("find\t:%d\n\n",max)
fmt.Println("found\t:",howMany)//9fmt.Println("value\t:",theNumbers)//[230320203]}
Outputprogram:
FungsiClosure
87
-
FungsiSebagaiparameterSetelahdibabsebelumnyakitabelajarmengenaifungsiyangmengembalikannilaibalikberupafungsi,kaliinitopiknyatidakkalahunik,yaitufungsiyangdigunakansebagaiparameter.
DiGolang,fungsibisadijadikansebagaitipedatavariabel.Darisitusangatmemungkinkanuntukmenjadikannyasebagaiparameterjuga.
PenerapanFungsiSebagaiParameterCaramembuatparameterfungsiadalahdenganlangsungmenuliskanskemafungsinyasebagaitipedata.Contohnyabisadilihatpadakodeberikut.
packagemain
import"fmt"import"strings"
funcfilter(data[]string,callbackfunc(string)bool)[]string{varresult[]stringfor_,each:=rangedata{iffiltered:=callback(each);filtered{result=append(result,each)}}returnresult}
Parametercallbackmerupakansebuahclosureyangdideklarasikanbertipefunc(string)bool.Closuretersebutdipanggilditiapperulangandalamfungsifilter().
Fungsifilter()sendiridigunakanuntukfilteringdataarray(yangd