table of contents pemrograman golang.pdf · fungsi fungsi multiple return fungsi variadic fungsi...

258

Upload: others

Post on 08-Mar-2020

20 views

Category:

Documents


0 download

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