Pergi - Panduan Cepat

Go adalah bahasa tujuan umum yang dirancang dengan memikirkan pemrograman sistem. Ini awalnya dikembangkan di Google pada tahun 2007 oleh Robert Griesemer, Rob Pike, dan Ken Thompson. Ini diketik dengan kuat dan statis, menyediakan dukungan bawaan untuk pengumpulan sampah, dan mendukung pemrograman bersamaan.

Program dibangun menggunakan paket, untuk pengelolaan dependensi yang efisien. Implementasi pemrograman Go menggunakan kompilasi tradisional dan model tautan untuk menghasilkan biner yang dapat dieksekusi. Bahasa pemrograman Go diumumkan pada November 2009 dan digunakan di beberapa sistem produksi Google.

Fitur Pemrograman Go

Fitur terpenting dari pemrograman Go tercantum di bawah ini -

  • Dukungan untuk lingkungan mengadopsi pola yang mirip dengan bahasa dinamis. Misalnya, tipe inferensi (x: = 0 adalah deklarasi valid dari variabel x tipe int)

  • Waktu kompilasi cepat.

  • Dukungan konkurensi bawaan: proses ringan (melalui rutinitas go), saluran, pernyataan pilih.

  • Program Go sederhana, ringkas, dan aman.

  • Dukungan untuk Antarmuka dan penyematan Jenis.

  • Produksi biner asli yang terhubung secara statis tanpa ketergantungan eksternal.

Fitur yang Dikecualikan Secara Sengaja

Agar bahasanya tetap sederhana dan ringkas, fitur berikut yang umumnya tersedia dalam bahasa serupa lainnya dihilangkan di Go -

  • Dukungan untuk pewarisan tipe

  • Dukungan untuk metode atau kelebihan beban operator

  • Dukungan untuk dependensi melingkar antar paket

  • Dukungan untuk aritmatika penunjuk

  • Dukungan untuk pernyataan

  • Dukungan untuk pemrograman generik

Go Program

Program Go dapat bervariasi panjangnya dari 3 baris hingga jutaan baris dan harus ditulis ke dalam satu atau lebih file teks dengan ekstensi ".go". Misalnya, hello.go.

Anda dapat menggunakan "vi", "vim" atau editor teks lainnya untuk menulis program Go Anda ke dalam sebuah file.

Pengaturan Lingkungan Lokal

Jika Anda masih ingin mengatur lingkungan Anda untuk bahasa pemrograman Go, Anda memerlukan dua perangkat lunak berikut yang tersedia di komputer Anda -

  • Seorang editor teks
  • Pergi kompiler

Editor Teks

Anda akan membutuhkan editor teks untuk mengetik program Anda. Contoh editor teks termasuk Windows Notepad, perintah OS Edit, Brief, Epsilon, EMACS, dan vim atau vi.

Nama dan versi editor teks dapat berbeda di setiap sistem operasi. Misalnya, Notepad digunakan di Windows, dan vim atau vi digunakan di Windows serta Linux atau UNIX.

File yang Anda buat dengan editor teks dipanggil source files. Mereka berisi kode sumber program. File sumber untuk program Go biasanya dinamai dengan ekstensi".go".

Sebelum memulai pemrograman Anda, pastikan Anda memiliki editor teks dan Anda memiliki cukup pengalaman untuk menulis program komputer, menyimpannya dalam sebuah file, mengkompilasinya, dan akhirnya menjalankannya.

Kompiler Go

Kode sumber yang ditulis dalam file sumber adalah sumber yang dapat dibaca manusia untuk program Anda. Itu perlu dikompilasi dan diubah menjadi bahasa mesin sehingga CPU Anda benar-benar dapat menjalankan program sesuai instruksi yang diberikan. Kompilator bahasa pemrograman Go mengkompilasi kode sumber ke dalam program eksekusi akhirnya.

Distribusi Go hadir sebagai biner yang dapat diinstal untuk FreeBSD (rilis 8 dan yang lebih baru), Linux, Mac OS X (Snow Leopard dan yang lebih baru), dan sistem operasi Windows dengan arsitektur prosesor 32-bit (386) dan 64-bit (amd64) x86.

Bagian berikut menjelaskan cara menginstal distribusi biner Go di berbagai OS.

Unduh Go Archive

Unduh versi terbaru file arsip Go yang dapat diinstal dari Go Downloads . Versi berikut digunakan dalam tutorial ini: go1.4.windows-amd64.msi .

Itu disalin ke folder C: \> go.

OS Nama arsip
Windows go1.4.windows-amd64.msi
Linux go1.4.linux-amd64.tar.gz
Mac go1.4.darwin-amd64-osx10.8.pkg
FreeBSD go1.4.freebsd-amd64.tar.gz

Instalasi di UNIX / Linux / Mac OS X, dan FreeBSD

Ekstrak arsip unduhan ke dalam folder / usr / local, buat pohon Go di / usr / local / go. Misalnya -

tar -C / usr / local -xzf go1.4.linux-amd64.tar.gz

Tambahkan / usr / local / go / bin ke variabel lingkungan PATH.

OS Keluaran
Linux ekspor PATH = $ PATH: / usr / local / go / bin
Mac ekspor PATH = $ PATH: / usr / local / go / bin
FreeBSD ekspor PATH = $ PATH: / usr / local / go / bin

Instalasi di Windows

Gunakan file MSI dan ikuti petunjuk untuk menginstal alat Go. Secara default, penginstal menggunakan distribusi Go di c: \ Go. Penginstal harus mengatur direktori c: \ Go \ bin di variabel lingkungan PATH Window. Mulai ulang setiap perintah terbuka yang meminta perubahan diterapkan.

Memverifikasi Instalasi

Buat file go bernama test.go in C:\>Go_WorkSpace.

File: test.go

package main

import "fmt"

func main() {
   fmt.Println("Hello, World!")
}

Sekarang jalankan test.go untuk melihat hasilnya -

C:\Go_WorkSpace>go run test.go

Keluaran

Hello, World!

Sebelum kita mempelajari blok bangunan dasar dari bahasa pemrograman Go, mari kita bahas terlebih dahulu struktur minimal dari program Go sehingga kita dapat menjadikannya sebagai referensi di bab-bab selanjutnya.

Contoh Halo Dunia

Program Go pada dasarnya terdiri dari bagian-bagian berikut -

  • Deklarasi Paket
  • Paket Impor
  • Functions
  • Variables
  • Pernyataan dan Ekspresi
  • Comments

Mari kita lihat kode sederhana yang akan mencetak kata "Hello World" -

package main

import "fmt"

func main() {
   /* This is my first sample program. */
   fmt.Println("Hello, World!")
}

Mari kita lihat berbagai bagian dari program di atas -

  • Baris pertama dari utama paket program mendefinisikan nama paket di mana program ini harus diletakkan. Ini adalah pernyataan wajib, karena program Go dijalankan dalam paket. Paket utama adalah titik awal untuk menjalankan program. Setiap paket memiliki jalur dan nama yang terkait dengannya.

  • Baris selanjutnya import "fmt" adalah perintah preprocessor yang memberitahu compiler Go untuk memasukkan file yang ada dalam paket fmt.

  • Baris berikutnya func main () adalah fungsi utama tempat eksekusi program dimulai.

  • Baris berikutnya /*...*/ diabaikan oleh kompiler dan ada untuk menambahkan komentar di program. Komentar juga direpresentasikan menggunakan // mirip dengan komentar Java atau C ++.

  • Baris berikutnya fmt.Println (...) adalah fungsi lain yang tersedia di Go yang menyebabkan pesan "Hello, World!" untuk ditampilkan di layar. Di sini paket fmt telah mengekspor metode Println yang digunakan untuk menampilkan pesan di layar.

  • Perhatikan modal P dari metode Println. Dalam bahasa Go, nama diekspor jika diawali dengan huruf kapital. Diekspor berarti fungsi atau variabel / konstanta dapat diakses oleh importir dari masing-masing paket.

Menjalankan Program Go

Mari kita bahas bagaimana cara menyimpan kode sumber dalam sebuah file, mengkompilasinya, dan akhirnya menjalankan program. Silakan ikuti langkah-langkah yang diberikan di bawah ini -

  • Buka editor teks dan tambahkan kode yang disebutkan di atas.

  • Simpan file sebagai hello.go

  • Buka prompt perintah.

  • Buka direktori tempat Anda menyimpan file.

  • Ketik go run hello.go dan tekan enter untuk menjalankan kode Anda.

  • Jika tidak ada kesalahan dalam kode Anda, maka Anda akan melihat "Hello World!" dicetak di layar.

$ go run hello.go
Hello, World!

Pastikan kompiler Go berada di jalur Anda dan Anda menjalankannya di direktori yang berisi file sumber hello.go.

Kita telah membahas struktur dasar program Go pada bab sebelumnya. Sekarang akan mudah untuk memahami blok bangunan dasar lainnya dari bahasa pemrograman Go.

Token di Go

Program Go terdiri dari berbagai token. Token bisa berupa kata kunci, pengenal, konstanta, string literal, atau simbol. Misalnya, pernyataan Go berikut terdiri dari enam token -

fmt.Println("Hello, World!")

Token individu adalah -

fmt
.
Println
(
   "Hello, World!"
)

Pemisah Garis

Dalam program Go, kunci pemisah garis adalah terminator pernyataan. Artinya, pernyataan individu tidak memerlukan pemisah khusus seperti ";" di C. Kompilator Go secara internal menempatkan “;” sebagai terminator pernyataan untuk menunjukkan akhir dari satu entitas logis.

Misalnya, lihat pernyataan berikut -

fmt.Println("Hello, World!")
fmt.Println("I am in Go Programming World!")

Komentar

Komentar seperti membantu teks dalam program Go Anda dan diabaikan oleh kompilator. Mereka mulai dengan / * dan diakhiri dengan karakter * / seperti yang ditunjukkan di bawah ini -

/* my first program in Go */

Anda tidak dapat memiliki komentar di dalam komentar dan tidak ada dalam string atau karakter literal.

Pengenal

Pengenal Go adalah nama yang digunakan untuk mengidentifikasi variabel, fungsi, atau item buatan pengguna lainnya. Pengenal dimulai dengan huruf A sampai Z atau a sampai z atau garis bawah _ diikuti dengan nol atau lebih huruf, garis bawah, dan angka (0 sampai 9).

pengidentifikasi = huruf {huruf | unicode_digit}.

Go tidak mengizinkan karakter tanda baca seperti @, $, dan% dalam pengenal. Go adalah acase-sensitivebahasa pemrograman. Jadi, Manpower dan manpower adalah dua pengenal berbeda di Go. Berikut beberapa contoh pengenal yang dapat diterima -

mahesh      kumar   abc   move_name   a_123
myname50   _temp    j      a23b9      retVal

Kata kunci

Daftar berikut menunjukkan kata-kata yang dipesan di Go. Kata-kata yang dicadangkan ini tidak boleh digunakan sebagai konstanta atau variabel atau nama pengenal lainnya.

istirahat default func antarmuka Pilih
kasus menunda Pergilah peta Struct
chan lain Pergi ke paket Beralih
const gagal jika jarak Tipe
terus untuk impor kembali Var

Spasi kosong di Go

Spasi kosong adalah istilah yang digunakan di Go untuk mendeskripsikan kosong, tab, karakter baris baru, dan komentar. Sebuah baris yang hanya berisi spasi, kemungkinan dengan sebuah komentar, disebut sebagai baris kosong, dan kompiler Go mengabaikannya sama sekali.

Spasi putih memisahkan satu bagian pernyataan dari yang lain dan memungkinkan kompiler untuk mengidentifikasi di mana satu elemen dalam pernyataan, seperti int, berakhir dan elemen berikutnya dimulai. Oleh karena itu, dalam pernyataan berikut -

var age int;

Harus ada setidaknya satu karakter spasi (biasanya spasi) antara int dan age agar kompilator dapat membedakannya. Di sisi lain, dalam pernyataan berikut -

fruit = apples + oranges;   // get the total fruit

Tidak ada karakter spasi kosong yang diperlukan antara buah dan =, atau antara = dan apel, meskipun Anda bebas memasukkan beberapa jika Anda ingin agar dapat dibaca.

Dalam bahasa pemrograman Go, tipe data mengacu pada sistem ekstensif yang digunakan untuk mendeklarasikan variabel atau fungsi dari tipe yang berbeda. Jenis variabel menentukan berapa banyak ruang yang ditempati dalam penyimpanan dan bagaimana pola bit yang disimpan diinterpretasikan.

Jenis di Go dapat diklasifikasikan sebagai berikut -

Sr.No. Jenis dan Deskripsi
1

Boolean types

Mereka adalah tipe boolean dan terdiri dari dua konstanta standar: (a) true (b) false

2

Numeric types

Mereka lagi-lagi merupakan tipe aritmatika dan merepresentasikan a) tipe integer atau b) nilai floating point di seluruh program.

3

String types

Jenis string mewakili kumpulan nilai string. Nilainya adalah urutan byte. String adalah jenis yang tidak dapat diubah yang setelah dibuat, konten string tidak dapat diubah. Jenis string yang dideklarasikan sebelumnya adalah string.

4

Derived types

Mereka termasuk (a) Jenis penunjuk, (b) Jenis Array, (c) Jenis struktur, (d) Jenis Union dan (e) Jenis fungsi f) Jenis irisan g) Jenis antarmuka h) Jenis peta i) Jenis Saluran

Jenis array dan jenis struktur secara kolektif disebut sebagai aggregate types. Jenis fungsi menentukan himpunan semua fungsi dengan parameter dan jenis hasil yang sama. Kita akan membahas tipe-tipe dasar pada bagian berikut, sedangkan tipe-tipe lainnya akan dibahas pada bab-bab selanjutnya.

Jenis Integer

Jenis integer arsitektur-independen yang telah ditentukan adalah -

Sr.No. Jenis dan Deskripsi
1

uint8

Integer 8-bit tidak bertanda tangan (0 hingga 255)

2

uint16

Integer 16-bit yang tidak bertanda tangan (0 hingga 65535)

3

uint32

Integer 32-bit tidak bertanda tangan (0 hingga 4294967295)

4

uint64

Integer 64-bit tidak bertanda tangan (0 hingga 18446744073709551615)

5

int8

Integer 8-bit yang ditandatangani (-128 hingga 127)

6

int16

Integer 16-bit yang ditandatangani (-32768 hingga 32767)

7

int32

Integer 32-bit yang ditandatangani (-2147483648 hingga 2147483647)

8

int64

Integer 64-bit yang ditandatangani (-9223372036854775808 hingga 9223372036854775807)

Jenis Mengambang

Jenis float tanpa arsitektur yang telah ditentukan sebelumnya adalah -

Sr.No. Jenis dan Deskripsi
1

float32

Angka floating-point IEEE-754 32-bit

2

float64

IEEE-754 64-bit angka floating-point

3

complex64

Bilangan kompleks dengan bagian nyata dan imajiner float32

4

complex128

Bilangan kompleks dengan bagian nyata dan imajiner float64

Nilai integer n-bit adalah n bit dan direpresentasikan menggunakan operasi aritmatika komplemen dua.

Jenis Numerik Lainnya

Ada juga satu set tipe numerik dengan ukuran khusus implementasi -

Sr.No. Jenis dan Deskripsi
1

byte

sama seperti uint8

2

rune

sama seperti int32

3

uint

32 atau 64 bit

4

int

ukuran yang sama seperti uint

5

uintptr

bilangan bulat unsigned untuk menyimpan bit yang tidak diinterpretasikan dari nilai pointer

Variabel tidak lain adalah nama yang diberikan ke area penyimpanan yang dapat dimanipulasi oleh program. Setiap variabel di Go memiliki tipe tertentu, yang menentukan ukuran dan tata letak memori variabel, rentang nilai yang dapat disimpan dalam memori tersebut, dan rangkaian operasi yang dapat diterapkan ke variabel.

Nama variabel dapat terdiri dari huruf, angka, dan karakter garis bawah. Ini harus dimulai dengan huruf atau garis bawah. Huruf besar dan kecil berbeda karena Go peka huruf besar / kecil. Berdasarkan tipe dasar yang dijelaskan pada bab sebelumnya, akan ada tipe variabel dasar berikut -

Sr Tidak Jenis & Deskripsi
1

byte

Biasanya satu oktet (satu byte). Ini adalah tipe byte.

2

int

Ukuran bilangan bulat paling alami untuk mesin.

3

float32

Nilai floating point presisi tunggal.

Bahasa pemrograman Go juga memungkinkan untuk mendefinisikan berbagai jenis variabel lain seperti Enumeration, Pointer, Array, Structure, dan Union, yang akan kita bahas pada bab-bab selanjutnya. Dalam bab ini, kami hanya akan memfokuskan tipe variabel dasar.

Definisi Variabel di Go

Definisi variabel memberi tahu compiler di mana dan berapa banyak penyimpanan yang harus dibuat untuk variabel. Definisi variabel menentukan tipe data dan berisi daftar satu atau lebih variabel dari tipe itu sebagai berikut -

var variable_list optional_data_type;

Sini, optional_data_type adalah tipe data Go yang valid termasuk byte, int, float32, complex64, boolean atau objek yang ditentukan pengguna, dll., dan variable_listdapat terdiri dari satu atau lebih nama pengenal yang dipisahkan dengan koma. Beberapa pernyataan valid ditampilkan di sini -

var  i, j, k int;
var  c, ch byte;
var  f, salary float32;
d =  42;

Pernyataan “var i, j, k;”mendeklarasikan dan mendefinisikan variabel i, j dan k; yang menginstruksikan kompilator untuk membuat variabel bernama i, j, dan k dengan tipe int.

Variabel dapat diinisialisasi (diberi nilai awal) dalam deklarasi mereka. Jenis variabel secara otomatis dinilai oleh kompilator berdasarkan nilai yang diteruskan padanya. Penginisialisasi terdiri dari tanda sama dengan diikuti dengan ekspresi konstan sebagai berikut -

variable_name = value;

Sebagai contoh,

d = 3, f = 5;    // declaration of d and f. Here d and f are int

Untuk definisi tanpa penginisialisasi: variabel dengan durasi penyimpanan statis secara implisit diinisialisasi dengan nil (semua byte memiliki nilai 0); nilai awal dari semua variabel lainnya adalah nilai nol dari tipe datanya.

Deklarasi Tipe Statis di Go

Deklarasi variabel tipe statis memberikan jaminan kepada compiler bahwa ada satu variabel yang tersedia dengan tipe dan nama yang diberikan sehingga compiler dapat melanjutkan untuk kompilasi lebih lanjut tanpa memerlukan detail variabel yang lengkap. Deklarasi variabel memiliki arti pada saat kompilasi saja, kompilator memerlukan deklarasi variabel aktual pada saat menautkan program.

Contoh

Coba contoh berikut, di mana variabel telah dideklarasikan dengan tipe dan diinisialisasi di dalam fungsi utama -

package main

import "fmt"

func main() {
   var x float64
   x = 20.0
   fmt.Println(x)
   fmt.Printf("x is of type %T\n", x)
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

20
x is of type float64

Deklarasi Tipe Dinamis / Jenis Inferensi di Go

Deklarasi variabel tipe dinamis membutuhkan compiler untuk menafsirkan tipe variabel berdasarkan nilai yang diteruskan padanya. Kompilator tidak memerlukan variabel untuk memiliki tipe statis sebagai persyaratan yang diperlukan.

Contoh

Coba contoh berikut, di mana variabel telah dideklarasikan tanpa tipe apa pun. Perhatikan, dalam kasus tipe inferensi, kami menginisialisasi variabely dengan: = operator, sedangkan x diinisialisasi menggunakan = operator.

package main

import "fmt"

func main() {
   var x float64 = 20.0

   y := 42 
   fmt.Println(x)
   fmt.Println(y)
   fmt.Printf("x is of type %T\n", x)
   fmt.Printf("y is of type %T\n", y)	
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

20
42
x is of type float64
y is of type int

Deklarasi Variabel Campuran di Go

Variabel dari jenis yang berbeda dapat dideklarasikan sekaligus menggunakan jenis inferensi.

Contoh

package main

import "fmt"

func main() {
   var a, b, c = 3, 4, "foo"  
	
   fmt.Println(a)
   fmt.Println(b)
   fmt.Println(c)
   fmt.Printf("a is of type %T\n", a)
   fmt.Printf("b is of type %T\n", b)
   fmt.Printf("c is of type %T\n", c)
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

3
4
foo
a is of type int
b is of type int
c is of type string

Lvalues ​​dan rvalues ​​di Go

Ada dua jenis ekspresi di Go -

  • lvalue- Ekspresi yang merujuk ke lokasi memori disebut ekspresi "lvalue". Nilai l dapat muncul sebagai sisi kiri atau kanan tugas.

  • rvalue- Istilah rvalue mengacu pada nilai data yang disimpan di beberapa alamat di memori. Nilai r adalah ekspresi yang tidak dapat memiliki nilai yang ditetapkan padanya yang berarti nilai r dapat muncul di sisi kanan tetapi tidak di sisi kiri tugas.

Variabel adalah lvalues ​​dan mungkin muncul di sisi kiri tugas. Literal numerik adalah nilai r sehingga mungkin tidak ditetapkan dan tidak dapat muncul di sisi kiri.

Pernyataan berikut ini valid -

x = 20.0

Pernyataan berikut tidak valid. Ini akan menghasilkan kesalahan waktu kompilasi -

10 = 20

Konstanta mengacu pada nilai tetap yang mungkin tidak diubah oleh program selama pelaksanaannya. Nilai tetap ini juga disebutliterals.

Konstanta dapat berupa salah satu tipe data dasar seperti konstanta integer, konstanta mengambang, konstanta karakter, atau literal string . Ada juga konstanta pencacahan.

Konstanta diperlakukan seperti variabel biasa kecuali nilainya tidak dapat diubah setelah definisinya.

Integer Literals

Literal bilangan bulat dapat berupa konstanta desimal, oktal, atau heksadesimal. Awalan menentukan basis atau radix: 0x atau 0X untuk heksadesimal, 0 untuk oktal, dan tidak ada untuk desimal.

Literal integer juga dapat memiliki sufiks yang merupakan kombinasi dari U dan L, masing-masing untuk unsigned dan long. Sufiks dapat berupa huruf besar atau kecil dan dapat dalam urutan apa pun.

Berikut adalah beberapa contoh literal integer -

212         /* Legal */
215u        /* Legal */
0xFeeL      /* Legal */
078         /* Illegal: 8 is not an octal digit */
032UU       /* Illegal: cannot repeat a suffix */

Berikut adalah contoh lain dari berbagai jenis literal Integer -

85         /* decimal */
0213       /* octal */
0x4b       /* hexadecimal */
30         /* int */
30u        /* unsigned int */
30l        /* long */
30ul       /* unsigned long */

Literal titik mengambang

Literal floating-point memiliki bagian bilangan bulat, titik desimal, bagian pecahan, dan bagian eksponen. Anda dapat merepresentasikan literal floating point baik dalam bentuk desimal atau eksponensial.

Saat merepresentasikan menggunakan bentuk desimal, Anda harus menyertakan titik desimal, eksponen, atau keduanya dan saat merepresentasikan menggunakan bentuk eksponensial, Anda harus menyertakan bagian bilangan bulat, bagian pecahan, atau keduanya. Eksponen bertanda tangan dikenalkan oleh e atau E.

Berikut beberapa contoh literal floating-point -

3.14159       /* Legal */
314159E-5L    /* Legal */
510E          /* Illegal: incomplete exponent */
210f          /* Illegal: no decimal or exponent */
.e55          /* Illegal: missing integer or fraction */

Urutan pelarian

Ketika karakter tertentu diawali dengan garis miring terbalik, mereka akan memiliki arti khusus di Go. Ini dikenal sebagai kode Urutan Escape yang digunakan untuk mewakili baris baru (\ n), tab (\ t), spasi mundur, dll. Di sini, Anda memiliki daftar dari beberapa kode urutan melarikan diri -

Urutan pelarian Berarti
\\ \ karakter
\ ' 'karakter
\ " "karakter
\? ? karakter
\Sebuah Peringatan atau bel
\ b Menghapus
\ f Bentuk pakan
\ n Garis baru
\ r Kereta kembali
\ t Tab horizontal
\ v Tab vertikal
\ ooo Nomor oktal satu sampai tiga digit
\ xhh. . . Bilangan heksadesimal dari satu atau lebih digit

Contoh berikut menunjukkan cara menggunakan \t dalam sebuah program -

package main

import "fmt"

func main() {
   fmt.Printf("Hello\tWorld!")
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Hello World!

String Literals di Go

Literal atau konstanta string diapit tanda kutip ganda "". Sebuah string berisi karakter yang mirip dengan literal karakter: karakter biasa, urutan escape, dan karakter universal.

Anda dapat memecah garis panjang menjadi beberapa baris menggunakan literal string dan memisahkannya menggunakan spasi.

Berikut beberapa contoh literal string. Ketiga bentuk tersebut adalah string yang identik.

"hello, dear"

"hello, \

dear"

"hello, " "d" "ear"

The const Kata Kunci

Kamu dapat memakai const prefiks untuk mendeklarasikan konstanta dengan tipe tertentu sebagai berikut -

const variable type = value;

Contoh berikut menunjukkan cara menggunakan file const kata kunci -

package main

import "fmt"

func main() {
   const LENGTH int = 10
   const WIDTH int = 5   
   var area int

   area = LENGTH * WIDTH
   fmt.Printf("value of area : %d", area)   
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

value of area : 50

Perhatikan bahwa ini adalah praktik pemrograman yang baik untuk mendefinisikan konstanta dalam MODAL.

Operator adalah simbol yang memberi tahu kompiler untuk melakukan manipulasi matematika atau logika tertentu. Bahasa Go kaya akan operator bawaan dan menyediakan jenis operator berikut -

  • Operator Aritmatika
  • Operator Relasional
  • Operator Logis
  • Operator Bitwise
  • Operator Penugasan
  • Operator Miscellaneous

Tutorial ini menjelaskan aritmatika, relasional, logika, bitwise, penugasan, dan operator lain satu per satu.

Operator Aritmatika

Tabel berikut menunjukkan semua operator aritmatika yang didukung oleh bahasa Go. Asumsikan variabelA memegang 10 dan variabel B memegang 20 lalu -

Tunjukkan Contoh

Operator Deskripsi Contoh
+ Menambahkan dua operan A + B menghasilkan 30
- Mengurangi operan kedua dari yang pertama A - B memberikan -10
* Menggandakan kedua operan A * B menghasilkan 200
/ Membagi pembilang dengan penyebut. B / A menghasilkan 2
% Operator modulus; memberikan sisa setelah pembagian integer. B% A menghasilkan 0
++ Operator increment. Ini meningkatkan nilai integer satu. A ++ menghasilkan 11
- Operator pengurangan. Ini mengurangi nilai integer satu. A-- memberi 9

Operator Relasional

Tabel berikut mencantumkan semua operator relasional yang didukung oleh bahasa Go. Asumsikan variabelA memegang 10 dan variabel B memegang 20, lalu -

Tunjukkan Contoh

Operator Deskripsi Contoh
== Ia memeriksa apakah nilai dari dua operan sama atau tidak; jika ya, kondisinya menjadi benar. (A == B) tidak benar.
! = Ia memeriksa apakah nilai dari dua operan sama atau tidak; jika nilainya tidak sama, maka kondisinya menjadi benar. (A! = B) benar.
> Ia memeriksa apakah nilai operan kiri lebih besar dari nilai operan kanan; jika ya, kondisinya menjadi benar. (A> B) tidak benar.
< Ia memeriksa apakah nilai operan kiri kurang dari nilai operan kanan; jika ya, kondisinya menjadi benar. (A <B) benar.
> = Ia memeriksa apakah nilai operan kiri lebih besar dari atau sama dengan nilai operan kanan; jika ya, kondisinya menjadi benar. (A> = B) tidak benar.
<= Ia memeriksa apakah nilai operan kiri kurang dari atau sama dengan nilai operan kanan; jika ya, kondisinya menjadi benar. (A <= B) benar.

Operator Logis

Tabel berikut mencantumkan semua operator logika yang didukung oleh bahasa Go. Asumsikan variabelA memegang 1 dan variabel B memegang 0, lalu -

Tunjukkan Contoh

Operator Deskripsi Contoh
&& Disebut Logical AND operator. Jika kedua operan bukan nol, maka kondisi menjadi benar. (A && B) salah.
|| Disebut Logical OR Operator. Jika salah satu dari dua operan bukan nol, maka kondisi menjadi benar. (A || B) itu benar.
! Disebut Logical NOT Operator. Gunakan untuk membalikkan keadaan logis operannya. Jika kondisi benar maka operator NOT akan membuat salah. ! (A && B) benar.

Tabel berikut menunjukkan semua operator logika yang didukung oleh bahasa Go. Asumsikan variabelA berlaku dan variabel B memegang salah, lalu -

Operator Deskripsi Contoh
&& Disebut Logical AND operator. Jika kedua operan salah, maka kondisinya menjadi salah. (A && B) salah.
|| Disebut Logical OR Operator. Jika salah satu dari dua operan benar, maka kondisinya menjadi benar. (A || B) itu benar.
! Disebut Logical NOT Operator. Gunakan untuk membalikkan keadaan logis operannya. Jika kondisi benar, maka operator NOT akan membuatnya salah. ! (A && B) benar.

Operator Bitwise

Operator bitwise bekerja pada bit dan melakukan operasi bit demi bit. Tabel kebenaran untuk &, |, dan ^ adalah sebagai berikut -

p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

Asumsikan A = 60; dan B = 13. Dalam format biner, mereka akan menjadi sebagai berikut -

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A | B = 0011 1101

A ^ B = 0011 0001

~ A = 1100 0011

Operator Bitwise yang didukung oleh bahasa C tercantum dalam tabel berikut. Asumsikan variabel A memiliki 60 dan variabel B memiliki 13, maka -

Tunjukkan Contoh

Operator Deskripsi Contoh
& Biner AND Operator menyalin sedikit ke hasil jika ada di kedua operan. (A & B) akan menghasilkan 12, yaitu 0000 1100
| Biner ATAU Operator menyalin sedikit jika ada di salah satu operan. (A | B) akan menghasilkan 61, yaitu 0011 1101
^ Operator Biner XOR menyalin bit jika diatur dalam satu operan tetapi tidak keduanya. (A ^ B) akan menghasilkan 49, yaitu 0011 0001
<< Operator Binary Left Shift. Nilai operan kiri dipindahkan ke kiri dengan jumlah bit yang ditentukan oleh operan kanan. A << 2 akan menghasilkan 240 yaitu 1111 0000
>> Operator Pergeseran Kanan Biner. Nilai operan kiri dipindahkan ke kanan dengan jumlah bit yang ditentukan oleh operan kanan. A >> 2 akan menghasilkan 15 yaitu 0000 1111

Operator Penugasan

Tabel berikut mencantumkan semua operator penugasan yang didukung oleh bahasa Go -

Tunjukkan Contoh

Operator Deskripsi Contoh
= Operator penugasan sederhana, Menetapkan nilai dari operan sisi kanan ke operan sisi kiri C = A + B akan memberikan nilai A + B ke dalam C
+ = Tambahkan AND operator penugasan, Ini menambahkan operan kanan ke operan kiri dan menetapkan hasilnya ke operan kiri C + = A ekivalen dengan C = C + A
- = Kurangi AND operator penugasan, Ini mengurangi operan kanan dari operan kiri dan menetapkan hasilnya ke operan kiri C - = A ekivalen dengan C = C - A
* = Kalikan DAN operator penugasan, Ini mengalikan operan kanan dengan operan kiri dan menetapkan hasilnya ke operan kiri C * = A ekivalen dengan C = C * A
/ = Bagi AND operator penugasan, Ini membagi operan kiri dengan operan kanan dan menetapkan hasilnya ke operan kiri C / = A ekivalen dengan C = C / A
% = Modulus AND operator penugasan, Dibutuhkan modulus menggunakan dua operan dan menetapkan hasilnya ke operan kiri C% = A setara dengan C = C% A
<< = Pergeseran kiri DAN operator penugasan C << = 2 sama dengan C = C << 2
>> = Shift kanan DAN operator penugasan C >> = 2 sama dengan C = C >> 2
& = Bitwise AND operator penugasan C & = 2 sama dengan C = C & 2
^ = bitwise eksklusif OR dan operator penugasan C ^ = 2 sama dengan C = C ^ 2
| = bitwise inklusif OR dan operator penugasan C | = 2 sama dengan C = C | 2

Operator Miscellaneous

Ada beberapa operator penting lainnya yang didukung oleh Go Language termasuk sizeof dan ?:.

Tunjukkan Contoh

Operator Deskripsi Contoh
& Menampilkan alamat variabel. &Sebuah; memberikan alamat sebenarnya dari variabel tersebut.
* Pointer ke variabel. *Sebuah; memberikan pointer ke variabel.

Operator Diutamakan di Go

Prioritas operator menentukan pengelompokan istilah dalam ekspresi. Ini memengaruhi bagaimana ekspresi dievaluasi. Operator tertentu memiliki prioritas lebih tinggi daripada yang lain; Misalnya, operator perkalian memiliki prioritas lebih tinggi daripada operator penjumlahan.

Misalnya x = 7 + 3 * 2; di sini, x ditetapkan 13, bukan 20 karena operator * memiliki prioritas lebih tinggi dari +, jadi pertama-tama dikalikan dengan 3 * 2 dan kemudian dijumlahkan menjadi 7.

Di sini, operator dengan prioritas tertinggi muncul di bagian atas tabel, operator dengan prioritas terendah muncul di bagian bawah. Dalam ekspresi, operator dengan prioritas lebih tinggi akan dievaluasi terlebih dahulu.

Tunjukkan Contoh

Kategori Operator Asosiatif
Postfix () [] ->. ++ - - Kiri ke kanan
Unary + -! ~ ++ - - (tipe) * & sizeof Kanan ke kiri
Perkalian * /% Kiri ke kanan
Aditif + - Kiri ke kanan
Bergeser << >> Kiri ke kanan
Relasional <<=>> = Kiri ke kanan
Persamaan ==! = Kiri ke kanan
Bitwise DAN & Kiri ke kanan
Bitwise XOR ^ Kiri ke kanan
Bitwise ATAU | Kiri ke kanan
DAN logis && Kiri ke kanan
Logis ATAU || Kiri ke kanan
Tugas = + = - = * = / =% = >> = << = & = ^ = | = Kanan ke kiri
Koma , Kiri ke kanan

Struktur pengambilan keputusan mengharuskan pemrogram menentukan satu atau lebih kondisi untuk dievaluasi atau diuji oleh program, bersama dengan pernyataan atau pernyataan yang akan dieksekusi jika kondisi ditentukan benar, dan secara opsional, pernyataan lain akan dijalankan jika kondisinya ditentukan sebagai salah.

Berikut ini adalah bentuk umum dari struktur pengambilan keputusan khas yang ditemukan di sebagian besar bahasa pemrograman -

Bahasa pemrograman Go menyediakan jenis pernyataan pengambilan keputusan berikut. Klik tautan berikut untuk memeriksa detailnya.

Sr Tidak Pernyataan & Deskripsi
1 jika pernyataan

Sebuah if statement terdiri dari ekspresi boolean yang diikuti oleh satu atau beberapa pernyataan.

2 jika ... pernyataan lain

Sebuah if statement bisa diikuti dengan opsional else statement, yang dijalankan jika ekspresi boolean salah.

3 pernyataan if bersarang

Anda bisa menggunakannya if atau else if pernyataan di dalam yang lain if atau else if pernyataan.

4 pernyataan switch

SEBUAH switch pernyataan memungkinkan variabel untuk diuji kesetaraan terhadap daftar nilai.

5 pilih pernyataan

SEBUAH select Pernyataannya mirip dengan switch pernyataan dengan perbedaan bahwa pernyataan kasus mengacu pada komunikasi saluran.

Mungkin ada situasi, ketika Anda perlu mengeksekusi blok kode beberapa kali. Secara umum, pernyataan dieksekusi secara berurutan: Pernyataan pertama dalam suatu fungsi dijalankan pertama, diikuti oleh yang kedua, dan seterusnya.

Bahasa pemrograman menyediakan berbagai struktur kontrol yang memungkinkan jalur eksekusi yang lebih rumit.

Pernyataan loop memungkinkan kita untuk mengeksekusi pernyataan atau sekelompok pernyataan beberapa kali dan berikut adalah bentuk umum dari pernyataan loop di sebagian besar bahasa pemrograman -

Bahasa pemrograman Go menyediakan tipe loop berikut untuk menangani persyaratan perulangan.

Sr Tidak Jenis & Deskripsi Loop
1 untuk loop

Ini mengeksekusi urutan pernyataan beberapa kali dan menyingkat kode yang mengelola variabel loop.

2 loop bersarang

Ini adalah satu atau beberapa loop di dalam loop for mana pun.

Pernyataan Kontrol Loop

Pernyataan kontrol loop mengubah eksekusi dari urutan normalnya. Saat eksekusi meninggalkan ruang lingkupnya, semua objek otomatis yang dibuat dalam lingkup itu akan dimusnahkan.

Go mendukung pernyataan kontrol berikut -

Sr Tidak Pernyataan & Deskripsi Kontrol
1 pernyataan istirahat

Ini mengakhiri a for loop atau switch pernyataan dan transfer eksekusi ke pernyataan segera setelah for loop atau switch.

2 lanjutkan pernyataan

Ini menyebabkan loop melewatkan sisa tubuhnya dan segera menguji ulang kondisinya sebelum mengulangi.

3 pernyataan goto

Ini mentransfer kontrol ke pernyataan berlabel.

Loop Tak Terbatas

Sebuah loop menjadi loop tak terbatas jika kondisinya tidak pernah menjadi salah. Perulangan for secara tradisional digunakan untuk tujuan ini. Karena tidak satu pun dari tiga ekspresi yang membentuk perulangan for diperlukan, Anda dapat membuat perulangan tanpa akhir dengan membiarkan ekspresi kondisional kosong atau dengan meneruskan true.

package main

import "fmt"

func main() {
   for true  {
       fmt.Printf("This loop will run forever.\n");
   }
}

Jika ekspresi kondisional tidak ada, maka dianggap benar. Anda mungkin memiliki inisialisasi dan ekspresi inkremen, tetapi programmer C lebih sering menggunakan konstruksi for (;;) untuk menandakan loop tak terbatas.

Note - Anda dapat menghentikan loop tak terbatas dengan menekan tombol Ctrl + C.

Fungsi adalah sekelompok pernyataan yang bersama-sama melakukan tugas. Setiap program Go memiliki setidaknya satu fungsi, yaitumain(). Anda dapat membagi kode Anda menjadi beberapa fungsi terpisah. Bagaimana Anda membagi kode Anda di antara fungsi yang berbeda terserah Anda, tetapi secara logis, pembagian harus sedemikian rupa sehingga setiap fungsi melakukan tugas tertentu.

Sebuah fungsi declarationmemberi tahu kompilator tentang nama fungsi, tipe kembalian, dan parameter. Sebuah fungsidefinition menyediakan tubuh sebenarnya dari fungsi tersebut.

Pustaka standar Go menyediakan banyak fungsi bawaan yang dapat dipanggil oleh program Anda. Misalnya fungsinyalen()mengambil argumen dari berbagai tipe dan mengembalikan panjang tipe. Jika sebuah string dilewatkan, fungsi mengembalikan panjang string dalam byte. Jika sebuah larik dilewatkan, fungsi tersebut mengembalikan panjang larik.

Fungsi juga dikenal sebagai method, sub-routine, atau procedure.

Mendefinisikan Fungsi

Bentuk umum definisi fungsi dalam bahasa pemrograman Go adalah sebagai berikut -

func function_name( [parameter list] ) [return_types]
{
   body of the function
}

Definisi fungsi dalam bahasa pemrograman Go terdiri dari header fungsi dan badan fungsi . Inilah semua bagian dari sebuah fungsi -

  • Func - Ini memulai deklarasi suatu fungsi.

  • Function Name- Ini adalah nama sebenarnya dari fungsinya. Nama fungsi dan daftar parameter bersama-sama membentuk tanda tangan fungsi.

  • Parameters- Parameter seperti placeholder. Saat suatu fungsi dipanggil, Anda meneruskan nilai ke parameter. Nilai ini disebut sebagai parameter atau argumen aktual. Daftar parameter mengacu pada jenis, urutan, dan jumlah parameter suatu fungsi. Parameter bersifat opsional; artinya, suatu fungsi mungkin tidak berisi parameter.

  • Return Type- Suatu fungsi dapat mengembalikan daftar nilai. Return_types adalah daftar tipe data dari nilai yang dikembalikan fungsi. Beberapa fungsi melakukan operasi yang diinginkan tanpa mengembalikan nilai. Dalam kasus ini, return_type tidak diperlukan.

  • Function Body - Berisi kumpulan pernyataan yang menentukan fungsi apa.

Contoh

Kode sumber berikut menunjukkan fungsi yang dipanggil max(). Fungsi ini mengambil dua parameter num1 dan num2 dan mengembalikan maksimum antara keduanya -

/* function returning the max between two numbers */
func max(num1, num2 int) int {
   /* local variable declaration */
   result int

   if (num1 > num2) {
      result = num1
   } else {
      result = num2
   }
   return result 
}

Memanggil Fungsi

Saat membuat fungsi Go, Anda memberikan definisi tentang apa yang harus dilakukan fungsi tersebut. Untuk menggunakan suatu fungsi, Anda harus memanggil fungsi itu untuk melakukan tugas yang ditentukan.

Ketika program memanggil suatu fungsi, kontrol program dipindahkan ke fungsi yang dipanggil. Fungsi yang dipanggil melakukan tugas yang ditentukan dan ketika pernyataan kembaliannya dijalankan atau ketika penjepit penutup akhir fungsinya tercapai, ia mengembalikan kontrol program kembali ke program utama.

Untuk memanggil suatu fungsi, Anda hanya perlu meneruskan parameter yang diperlukan bersama dengan nama fungsinya. Jika fungsi mengembalikan nilai, maka Anda dapat menyimpan nilai yang dikembalikan. Misalnya -

package main

import "fmt"

func main() {
   /* local variable definition */
   var a int = 100
   var b int = 200
   var ret int

   /* calling a function to get max value */
   ret = max(a, b)

   fmt.Printf( "Max value is : %d\n", ret )
}

/* function returning the max between two numbers */
func max(num1, num2 int) int {
   /* local variable declaration */
   var result int

   if (num1 > num2) {
      result = num1
   } else {
      result = num2
   }
   return result 
}

Kami telah mempertahankan fungsi max () bersama dengan fungsi main () dan mengkompilasi kode sumber. Saat menjalankan eksekusi akhir, itu akan menghasilkan hasil sebagai berikut -

Max value is : 200

Mengembalikan beberapa nilai dari Fungsi

Fungsi Go dapat mengembalikan banyak nilai. Misalnya -

package main

import "fmt"

func swap(x, y string) (string, string) {
   return y, x
}
func main() {
   a, b := swap("Mahesh", "Kumar")
   fmt.Println(a, b)
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Kumar Mahesh

Argumen Fungsi

Jika suatu fungsi akan menggunakan argumen, ia harus mendeklarasikan variabel yang menerima nilai argumen. Variabel ini disebutformal parameters dari fungsinya.

Parameter formal berperilaku seperti variabel lokal lainnya di dalam fungsi dan dibuat saat masuk ke fungsi dan dimusnahkan saat keluar.

Saat memanggil suatu fungsi, ada dua cara argumen dapat diteruskan ke suatu fungsi -

Sr Tidak Jenis & Deskripsi Panggilan
1 Panggilan berdasarkan nilai

Metode ini menyalin nilai sebenarnya dari sebuah argumen ke dalam parameter formal dari fungsi tersebut. Dalam kasus ini, perubahan yang dilakukan pada parameter di dalam fungsi tidak berpengaruh pada argumen.

2 Panggil dengan referensi

Metode ini menyalin alamat argumen ke dalam parameter formal. Di dalam fungsinya, alamat digunakan untuk mengakses argumen sebenarnya yang digunakan dalam panggilan. Ini berarti bahwa perubahan yang dilakukan pada parameter mempengaruhi argumen.

Secara default, Go menggunakan panggilan berdasarkan nilai untuk meneruskan argumen. Secara umum, ini berarti kode dalam suatu fungsi tidak dapat mengubah argumen yang digunakan untuk memanggil fungsi tersebut. Program di atas, saat memanggil fungsi max (), menggunakan metode yang sama.

Penggunaan Fungsi

Suatu fungsi dapat digunakan dengan cara berikut:

Sr Tidak Fungsi Penggunaan & Deskripsi
1 Berfungsi sebagai Nilai

Fungsi dapat dibuat dengan cepat dan dapat digunakan sebagai nilai.

2 Penutupan Fungsi

Penutupan fungsi adalah fungsi anonim dan dapat digunakan dalam pemrograman dinamis.

3 metode

Metode adalah fungsi khusus dengan penerima.

Cakupan dalam pemrograman apa pun adalah wilayah program di mana variabel yang ditentukan dapat ada dan di luar itu variabel tidak dapat diakses. Ada tiga tempat di mana variabel dapat dideklarasikan dalam bahasa pemrograman Go -

  • Di dalam fungsi atau blok (local variabel)

  • Di luar semua fungsi (global variabel)

  • Dalam definisi parameter fungsi (formal parameter)

Mari kita cari tahu apa itu local dan global variabel dan apa formal parameter.

Variabel Lokal

Variabel yang dideklarasikan di dalam fungsi atau blok disebut variabel lokal. Mereka hanya dapat digunakan oleh pernyataan yang ada di dalam fungsi atau blok kode itu. Variabel lokal tidak diketahui fungsi di luarnya sendiri. Contoh berikut menggunakan variabel lokal. Di sini semua variabel a, b, dan c lokal ke fungsi main ().

package main

import "fmt"

func main() {
   /* local variable declaration */
   var a, b, c int 

   /* actual initialization */
   a = 10
   b = 20
   c = a + b

   fmt.Printf ("value of a = %d, b = %d and c = %d\n", a, b, c)
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

value of a = 10, b = 20 and c = 30

Variabel Global

Variabel global didefinisikan di luar fungsi, biasanya di atas program. Variabel global memiliki nilainya sepanjang masa program dan dapat diakses di dalam salah satu fungsi yang ditentukan untuk program.

Variabel global dapat diakses oleh fungsi apa pun. Artinya, variabel global tersedia untuk digunakan di seluruh program setelah deklarasi. Contoh berikut menggunakan variabel global dan lokal -

package main

import "fmt"
 
/* global variable declaration */
var g int
 
func main() {
   /* local variable declaration */
   var a, b int

   /* actual initialization */
   a = 10
   b = 20
   g = a + b

   fmt.Printf("value of a = %d, b = %d and g = %d\n", a, b, g)
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

value of a = 10, b = 20 and g = 30

Suatu program dapat memiliki nama yang sama untuk variabel lokal dan global tetapi nilai variabel lokal di dalam suatu fungsi lebih diutamakan. Misalnya -

package main

import "fmt"
 
/* global variable declaration */
var g int = 20
 
func main() {
   /* local variable declaration */
   var g int = 10
 
   fmt.Printf ("value of g = %d\n",  g)
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

value of g = 10

Parameter Formal

Parameter formal diperlakukan sebagai variabel lokal dengan-dalam fungsi itu dan mereka mengambil preferensi atas variabel global. Misalnya -

package main

import "fmt"
 
/* global variable declaration */
var a int = 20;
 
func main() {
   /* local variable declaration in main function */
   var a int = 10
   var b int = 20
   var c int = 0

   fmt.Printf("value of a in main() = %d\n",  a);
   c = sum( a, b);
   fmt.Printf("value of c in main() = %d\n",  c);
}
/* function to add two integers */
func sum(a, b int) int {
   fmt.Printf("value of a in sum() = %d\n",  a);
   fmt.Printf("value of b in sum() = %d\n",  b);

   return a + b;
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

value of a in main() = 10
value of a in sum() = 10
value of b in sum() = 20
value of c in main() = 30

Menginisialisasi Variabel Lokal dan Global

Variabel lokal dan global diinisialisasi ke nilai defaultnya, yaitu 0; sedangkan pointer diinisialisasi menjadi nol.

Tipe data Nilai Default Awal
int 0
float32 0
penunjuk nol

String, yang banyak digunakan dalam pemrograman Go, adalah potongan byte yang hanya bisa dibaca. Dalam bahasa pemrograman Go, string adalahslices. Platform Go menyediakan berbagai pustaka untuk memanipulasi string.

  • unicode
  • regexp
  • strings

Membuat String

Cara paling langsung untuk membuat string adalah dengan menulis -

var greeting = "Hello world!"

Setiap kali menemukan string literal dalam kode Anda, kompilator membuat objek string dengan nilainya dalam hal ini, "Halo dunia! '.

Literal string memiliki urutan UTF-8 yang valid yang disebut rune. Sebuah String menyimpan byte yang berubah-ubah.

package main

import "fmt"

func main() {
   var greeting =  "Hello world!"
   
   fmt.Printf("normal string: ")
   fmt.Printf("%s", greeting)
   fmt.Printf("\n")
   fmt.Printf("hex bytes: ")
   
   for i := 0; i < len(greeting); i++ {
       fmt.Printf("%x ", greeting[i])
   }
   fmt.Printf("\n")
   
   const sampleText = "\xbd\xb2\x3d\xbc\x20\xe2\x8c\x98" 
   /*q flag escapes unprintable characters, with + flag it escapses non-ascii 
   characters as well to make output unambigous  
   */
   fmt.Printf("quoted string: ")
   fmt.Printf("%+q", sampleText)
   fmt.Printf("\n")  
}

Ini akan menghasilkan hasil sebagai berikut -

normal string: Hello world!
hex bytes: 48 65 6c 6c 6f 20 77 6f 72 6c 64 21 
quoted string: "\xbd\xb2=\xbc \u2318"

Note - String literal tidak dapat diubah, sehingga setelah dibuat, literal string tidak dapat diubah.

Panjang String

Metode len (str) mengembalikan jumlah byte yang terkandung dalam string literal.

package main

import "fmt"

func main() {
   var greeting =  "Hello world!"
   
   fmt.Printf("String Length is: ")
   fmt.Println(len(greeting))  
}

Ini akan menghasilkan hasil sebagai berikut -

String Length is : 12

String Penggabungan

Paket string menyertakan sebuah metode join untuk menggabungkan beberapa string -

strings.Join(sample, " ")

Gabung menggabungkan elemen-elemen array untuk membuat satu string. Parameter kedua adalah separator yang ditempatkan di antara elemen array.

Mari kita lihat contoh berikut -

package main

import ("fmt" "math" )"fmt" "strings")

func main() {
   greetings :=  []string{"Hello","world!"}   
   fmt.Println(strings.Join(greetings, " "))
}

Ini akan menghasilkan hasil sebagai berikut -

Hello world!

Bahasa pemrograman Go menyediakan struktur data yang disebut the array, yang dapat menyimpan kumpulan elemen berurutan ukuran tetap dari jenis yang sama. Sebuah array digunakan untuk menyimpan kumpulan data, tetapi seringkali lebih berguna untuk menganggap array sebagai kumpulan variabel dengan tipe yang sama.

Alih-alih mendeklarasikan variabel individual, seperti number0, number1, ..., dan number99, Anda mendeklarasikan satu variabel array seperti bilangan dan menggunakan bilangan [0], bilangan [1], dan ..., bilangan [99] untuk mewakili variabel individu. Elemen tertentu dalam array diakses oleh indeks.

Semua array terdiri dari lokasi memori yang berdekatan. Alamat terendah sesuai dengan elemen pertama dan alamat tertinggi untuk elemen terakhir.

Mendeklarasikan Array

Untuk mendeklarasikan sebuah array di Go, seorang programmer menentukan jenis elemen dan jumlah elemen yang dibutuhkan oleh sebuah array sebagai berikut:

var variable_name [SIZE] variable_type

Ini disebut larik berdimensi tunggal . ItuarraySize harus berupa konstanta bilangan bulat yang lebih besar dari nol dan typedapat berupa tipe data Go yang valid. Misalnya, untuk mendeklarasikan array 10 elemen yang dipanggilbalance dari tipe float32, gunakan pernyataan ini -

var balance [10] float32

Sini, balance adalah array variabel yang dapat menampung hingga 10 angka float.

Menginisialisasi Array

Anda dapat menginisialisasi array di Go satu per satu atau menggunakan satu pernyataan sebagai berikut -

var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

Jumlah nilai di antara tanda kurung kurawal {} tidak boleh lebih besar dari jumlah elemen yang kita nyatakan untuk larik di antara tanda kurung siku [].

Jika Anda menghilangkan ukuran array, array yang cukup besar untuk menampung inisialisasi akan dibuat. Karena itu, jika Anda menulis -

var balance = []float32{1000.0, 2.0, 3.4, 7.0, 50.0}

Anda akan membuat larik yang persis sama seperti yang Anda lakukan di contoh sebelumnya. Berikut adalah contoh untuk menetapkan satu elemen dari array -

balance[4] = 50.0

Di atas wakilnya pernyataan sejumlah elemen 5 th dalam array dengan nilai 50,0. Semua array memiliki 0 sebagai indeks dari elemen pertamanya yang juga disebut indeks dasar dan indeks terakhir dari sebuah array akan menjadi ukuran total dari array tersebut dikurangi 1. Berikut adalah representasi gambar dari array yang sama yang kita bahas di atas -

Mengakses Elemen Array

Sebuah elemen diakses dengan mengindeks nama array. Ini dilakukan dengan menempatkan indeks elemen dalam tanda kurung siku setelah nama array. Misalnya -

float32 salary = balance[9]

Pernyataan di atas akan mengambil elemen ke- 10 dari array dan menetapkan nilainya ke variabel gaji. Berikut adalah contoh yang akan menggunakan semua tiga konsep yang disebutkan di atas yaitu. deklarasi, tugas dan mengakses array -

package main

import "fmt"

func main() {
   var n [10]int /* n is an array of 10 integers */
   var i,j int

   /* initialize elements of array n to 0 */         
   for i = 0; i < 10; i++ {
      n[i] = i + 100 /* set element at location i to i + 100 */
   }
   /* output each array element's value */
   for j = 0; j < 10; j++ {
      fmt.Printf("Element[%d] = %d\n", j, n[j] )
   }
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109

Pergi Array secara Detail

Ada konsep penting yang terkait dengan array yang harus jelas bagi programmer Go -

Sr Tidak Konsep & Deskripsi
1 Array multi-dimensi

Go mendukung array multidimensi. Bentuk paling sederhana dari array multidimensi adalah array dua dimensi.

2 Meneruskan array ke fungsi

Anda bisa meneruskan ke fungsi sebuah pointer ke sebuah array dengan menentukan nama array tanpa indeks.

Petunjuk di Go mudah dan menyenangkan untuk dipelajari. Beberapa tugas pemrograman Go dilakukan lebih mudah dengan pointer, dan tugas lain, seperti panggilan dengan referensi, tidak dapat dilakukan tanpa menggunakan pointer. Jadi penting untuk mempelajari pointer untuk menjadi programmer Go yang sempurna.

Seperti yang Anda ketahui, setiap variabel adalah lokasi memori dan setiap lokasi memori memiliki alamat yang ditentukan yang dapat diakses menggunakan operator ampersand (&), yang menunjukkan alamat dalam memori. Perhatikan contoh berikut, yang akan mencetak alamat dari variabel yang ditentukan -

package main

import "fmt"

func main() {
   var a int = 10   
   fmt.Printf("Address of a variable: %x\n", &a  )
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Address of a variable: 10328000

Jadi Anda mengerti apa itu alamat memori dan bagaimana mengaksesnya. Sekarang mari kita lihat apa itu pointer.

Apa Itu Pointer?

SEBUAH pointeradalah variabel yang nilainya adalah alamat variabel lain, yaitu alamat langsung dari lokasi memori. Seperti variabel atau konstanta apa pun, Anda harus mendeklarasikan sebuah pointer sebelum Anda dapat menggunakannya untuk menyimpan alamat variabel apa pun. Bentuk umum dari deklarasi variabel pointer adalah -

var var_name *var-type

Sini, typeadalah tipe dasar pointer; itu harus tipe data C yang valid danvar-nameadalah nama variabel penunjuk. Tanda bintang * yang Anda gunakan untuk menyatakan penunjuk adalah tanda bintang yang sama dengan yang Anda gunakan untuk perkalian. Namun, dalam pernyataan ini tanda bintang digunakan untuk menunjukkan variabel sebagai penunjuk. Berikut adalah deklarasi pointer yang valid -

var ip *int        /* pointer to an integer */
var fp *float32    /* pointer to a float */

Tipe data aktual dari nilai semua pointer, apakah integer, float, atau sebaliknya, adalah sama, angka heksadesimal panjang yang mewakili alamat memori. Satu-satunya perbedaan antara pointer dari tipe data yang berbeda adalah tipe data dari variabel atau konstanta yang ditunjuk pointer.

Bagaimana Cara Menggunakan Pointer?

Ada beberapa operasi penting, yang sering kami lakukan dengan pointer: (a) kami mendefinisikan variabel pointer, (b) menetapkan alamat variabel ke pointer, dan (c) mengakses nilai pada alamat yang disimpan dalam variabel pointer .

Semua operasi ini dilakukan dengan menggunakan operator unary * yang mengembalikan nilai variabel yang terletak di alamat yang ditentukan oleh operannya. Contoh berikut menunjukkan cara melakukan operasi ini -

package main

import "fmt"

func main() {
   var a int = 20   /* actual variable declaration */
   var ip *int      /* pointer variable declaration */

   ip = &a  /* store address of a in pointer variable*/

   fmt.Printf("Address of a variable: %x\n", &a  )

   /* address stored in pointer variable */
   fmt.Printf("Address stored in ip variable: %x\n", ip )

   /* access the value using the pointer */
   fmt.Printf("Value of *ip variable: %d\n", *ip )
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Address of var variable: 10328000
Address stored in ip variable: 10328000
Value of *ip variable: 20

Pointer Nihil di Go

Kompiler Go menetapkan nilai Nil ke variabel pointer jika Anda tidak memiliki alamat yang tepat untuk ditugaskan. Ini dilakukan pada saat deklarasi variabel. Sebuah pointer yang diberi nilai nol disebut anil penunjuk.

Pointer nil adalah konstanta dengan nilai nol yang ditentukan di beberapa pustaka standar. Pertimbangkan program berikut -

package main

import "fmt"

func main() {
   var  ptr *int

   fmt.Printf("The value of ptr is : %x\n", ptr  )
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

The value of ptr is 0

Di sebagian besar sistem operasi, program tidak diizinkan untuk mengakses memori di alamat 0 karena memori tersebut dicadangkan oleh sistem operasi. Bagaimanapun, alamat memori 0 memiliki arti khusus; itu menandakan bahwa penunjuk tidak dimaksudkan untuk menunjuk ke lokasi memori yang dapat diakses. Tetapi secara konvensi, jika sebuah pointer berisi nilai nil (nol), itu dianggap tidak menunjuk ke apa-apa.

Untuk memeriksa pointer nil Anda dapat menggunakan pernyataan if sebagai berikut -

if(ptr != nil)     /* succeeds if p is not nil */
if(ptr == nil)    /* succeeds if p is null */

Pergi Pointer secara Detail

Pointer memiliki banyak konsep tetapi mudah dan sangat penting untuk pemrograman Go. Konsep pointer berikut harus jelas bagi programmer Go -

Sr Tidak Konsep & Deskripsi
1 Pergi - Array pointer

Anda dapat menentukan array untuk menampung sejumlah pointer.

2 Pergi - Arahkan ke penunjuk

Go memungkinkan Anda memiliki penunjuk pada penunjuk dan sebagainya.

3 Meneruskan petunjuk ke fungsi di Go

Meneruskan argumen dengan referensi atau dengan alamat keduanya memungkinkan argumen yang diteruskan diubah dalam fungsi pemanggil oleh fungsi yang dipanggil.

Array Go memungkinkan Anda untuk mendefinisikan variabel yang dapat menampung beberapa item data dari jenis yang sama. Structure adalah tipe data lain yang ditentukan pengguna yang tersedia dalam pemrograman Go, yang memungkinkan Anda menggabungkan item data dari berbagai jenis.

Struktur digunakan untuk merepresentasikan record. Misalkan Anda ingin melacak buku-buku di perpustakaan. Anda mungkin ingin melacak atribut berikut dari setiap buku -

  • Title
  • Author
  • Subject
  • ID Buku

Dalam skenario seperti itu, struktur sangat berguna.

Mendefinisikan Struktur

Untuk menentukan struktur, Anda harus menggunakan type dan structpernyataan. Pernyataan struct mendefinisikan tipe data baru, dengan banyak anggota untuk program Anda. Pernyataan type mengikat nama dengan tipe yang struct dalam kasus kami. Format pernyataan struct adalah sebagai berikut -

type struct_variable_type struct {
   member definition;
   member definition;
   ...
   member definition;
}

Setelah tipe struktur ditentukan, itu dapat digunakan untuk mendeklarasikan variabel dari tipe tersebut menggunakan sintaks berikut.

variable_name := structure_variable_type {value1, value2...valuen}

Mengakses Anggota Struktur

Untuk mengakses anggota struktur mana pun, kami menggunakan member access operator (.).Operator akses anggota dikodekan sebagai periode antara nama variabel struktur dan anggota struktur yang ingin kita akses. Anda akan menggunakanstructkata kunci untuk mendefinisikan variabel jenis struktur. Contoh berikut menjelaskan cara menggunakan struktur -

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}
func main() {
   var Book1 Books    /* Declare Book1 of type Book */
   var Book2 Books    /* Declare Book2 of type Book */
 
   /* book 1 specification */
   Book1.title = "Go Programming"
   Book1.author = "Mahesh Kumar"
   Book1.subject = "Go Programming Tutorial"
   Book1.book_id = 6495407

   /* book 2 specification */
   Book2.title = "Telecom Billing"
   Book2.author = "Zara Ali"
   Book2.subject = "Telecom Billing Tutorial"
   Book2.book_id = 6495700
 
   /* print Book1 info */
   fmt.Printf( "Book 1 title : %s\n", Book1.title)
   fmt.Printf( "Book 1 author : %s\n", Book1.author)
   fmt.Printf( "Book 1 subject : %s\n", Book1.subject)
   fmt.Printf( "Book 1 book_id : %d\n", Book1.book_id)

   /* print Book2 info */
   fmt.Printf( "Book 2 title : %s\n", Book2.title)
   fmt.Printf( "Book 2 author : %s\n", Book2.author)
   fmt.Printf( "Book 2 subject : %s\n", Book2.subject)
   fmt.Printf( "Book 2 book_id : %d\n", Book2.book_id)
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Book 1 title      : Go Programming
Book 1 author     : Mahesh Kumar
Book 1 subject    : Go Programming Tutorial
Book 1 book_id    : 6495407
Book 2 title      : Telecom Billing
Book 2 author     : Zara Ali
Book 2 subject    : Telecom Billing Tutorial
Book 2 book_id    : 6495700

Struktur sebagai Argumen Fungsi

Anda dapat mengirimkan struktur sebagai argumen fungsi dengan cara yang sangat mirip seperti Anda meneruskan variabel atau penunjuk lainnya. Anda akan mengakses variabel struktur dengan cara yang sama seperti yang Anda lakukan pada contoh di atas -

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}
func main() {
   var Book1 Books    /* Declare Book1 of type Book */
   var Book2 Books    /* Declare Book2 of type Book */
 
   /* book 1 specification */
   Book1.title = "Go Programming"
   Book1.author = "Mahesh Kumar"
   Book1.subject = "Go Programming Tutorial"
   Book1.book_id = 6495407

   /* book 2 specification */
   Book2.title = "Telecom Billing"
   Book2.author = "Zara Ali"
   Book2.subject = "Telecom Billing Tutorial"
   Book2.book_id = 6495700
 
   /* print Book1 info */
   printBook(Book1)

   /* print Book2 info */
   printBook(Book2)
}
func printBook( book Books ) {
   fmt.Printf( "Book title : %s\n", book.title);
   fmt.Printf( "Book author : %s\n", book.author);
   fmt.Printf( "Book subject : %s\n", book.subject);
   fmt.Printf( "Book book_id : %d\n", book.book_id);
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Book title     : Go Programming
Book author    : Mahesh Kumar
Book subject   : Go Programming Tutorial
Book book_id   : 6495407
Book title     : Telecom Billing
Book author    : Zara Ali
Book subject   : Telecom Billing Tutorial
Book book_id   : 6495700

Petunjuk ke Struktur

Anda dapat mendefinisikan pointer ke struktur dengan cara yang sama seperti Anda mendefinisikan pointer ke variabel lain sebagai berikut -

var struct_pointer *Books

Now, you can store the address of a structure variable in the above defined pointer variable. To find the address of a structure variable, place the & operator before the structure's name as follows −

struct_pointer = &Book1;

To access the members of a structure using a pointer to that structure, you must use the "." operator as follows −

struct_pointer.title;

Let us re-write the above example using structure pointer −

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}
func main() {
   var Book1 Books   /* Declare Book1 of type Book */
   var Book2 Books   /* Declare Book2 of type Book */
 
   /* book 1 specification */
   Book1.title = "Go Programming"
   Book1.author = "Mahesh Kumar"
   Book1.subject = "Go Programming Tutorial"
   Book1.book_id = 6495407

   /* book 2 specification */
   Book2.title = "Telecom Billing"
   Book2.author = "Zara Ali"
   Book2.subject = "Telecom Billing Tutorial"
   Book2.book_id = 6495700
 
   /* print Book1 info */
   printBook(&Book1)

   /* print Book2 info */
   printBook(&Book2)
}
func printBook( book *Books ) {
   fmt.Printf( "Book title : %s\n", book.title);
   fmt.Printf( "Book author : %s\n", book.author);
   fmt.Printf( "Book subject : %s\n", book.subject);
   fmt.Printf( "Book book_id : %d\n", book.book_id);
}

When the above code is compiled and executed, it produces the following result −

Book title     : Go Programming
Book author    : Mahesh Kumar
Book subject   : Go Programming Tutorial
Book book_id   : 6495407
Book title     : Telecom Billing
Book author    : Zara Ali
Book subject   : Telecom Billing Tutorial
Book book_id   : 6495700

Go Slice is an abstraction over Go Array. Go Array allows you to define variables that can hold several data items of the same kind but it does not provide any inbuilt method to increase its size dynamically or get a sub-array of its own. Slices overcome this limitation. It provides many utility functions required on Array and is widely used in Go programming.

Defining a slice

To define a slice, you can declare it as an array without specifying its size. Alternatively, you can use make function to create a slice.

var numbers []int /* a slice of unspecified size */
/* numbers == []int{0,0,0,0,0}*/
numbers = make([]int,5,5) /* a slice of length 5 and capacity 5*/

len() and cap() functions

A slice is an abstraction over array. It actually uses arrays as an underlying structure. The len() function returns the elements presents in the slice where cap() function returns the capacity of the slice (i.e., how many elements it can be accommodate). The following example explains the usage of slice −

package main

import "fmt"

func main() {
   var numbers = make([]int,3,5)
   printSlice(numbers)
}
func printSlice(x []int){
   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

When the above code is compiled and executed, it produces the following result −

len = 3 cap = 5 slice = [0 0 0]

Nil slice

If a slice is declared with no inputs, then by default, it is initialized as nil. Its length and capacity are zero. For example −

package main

import "fmt"

func main() {
   var numbers []int
   printSlice(numbers)
   
   if(numbers == nil){
      fmt.Printf("slice is nil")
   }
}
func printSlice(x []int){
   fmt.Printf("len = %d cap = %d slice = %v\n", len(x), cap(x),x)
}

When the above code is compiled and executed, it produces the following result −

len = 0 cap = 0 slice = []
slice is nil

Subslicing

Slice allows lower-bound and upper bound to be specified to get the subslice of it using[lower-bound:upper-bound]. For example −

package main

import "fmt"

func main() {
   /* create a slice */
   numbers := []int{0,1,2,3,4,5,6,7,8}   
   printSlice(numbers)
   
   /* print the original slice */
   fmt.Println("numbers ==", numbers)
   
   /* print the sub slice starting from index 1(included) to index 4(excluded)*/
   fmt.Println("numbers[1:4] ==", numbers[1:4])
   
   /* missing lower bound implies 0*/
   fmt.Println("numbers[:3] ==", numbers[:3])
   
   /* missing upper bound implies len(s)*/
   fmt.Println("numbers[4:] ==", numbers[4:])
   
   numbers1 := make([]int,0,5)
   printSlice(numbers1)
   
   /* print the sub slice starting from index 0(included) to index 2(excluded) */
   number2 := numbers[:2]
   printSlice(number2)
   
   /* print the sub slice starting from index 2(included) to index 5(excluded) */
   number3 := numbers[2:5]
   printSlice(number3)
   
}
func printSlice(x []int){
   fmt.Printf("len = %d cap = %d slice = %v\n", len(x), cap(x),x)
}

When the above code is compiled and executed, it produces the following result −

len = 9 cap = 9 slice = [0 1 2 3 4 5 6 7 8]
numbers == [0 1 2 3 4 5 6 7 8]
numbers[1:4] == [1 2 3]
numbers[:3] == [0 1 2]
numbers[4:] == [4 5 6 7 8]
len = 0 cap = 5 slice = []
len = 2 cap = 9  slice = [0 1]
len = 3 cap = 7 slice = [2 3 4]

append() and copy() Functions

One can increase the capacity of a slice using the append() function. Using copy()function, the contents of a source slice are copied to a destination slice. For example −

package main

import "fmt"

func main() {
   var numbers []int
   printSlice(numbers)
   
   /* append allows nil slice */
   numbers = append(numbers, 0)
   printSlice(numbers)
   
   /* add one element to slice*/
   numbers = append(numbers, 1)
   printSlice(numbers)
   
   /* add more than one element at a time*/
   numbers = append(numbers, 2,3,4)
   printSlice(numbers)
   
   /* create a slice numbers1 with double the capacity of earlier slice*/
   numbers1 := make([]int, len(numbers), (cap(numbers))*2)
   
   /* copy content of numbers to numbers1 */
   copy(numbers1,numbers)
   printSlice(numbers1)   
}
func printSlice(x []int){
   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

When the above code is compiled and executed, it produces the following result −

len = 0 cap = 0 slice = []
len = 1 cap = 2 slice = [0]
len = 2 cap = 2 slice = [0 1]
len = 5 cap = 8 slice = [0 1 2 3 4]
len = 5 cap = 16 slice = [0 1 2 3 4]

The range keyword is used in for loop to iterate over items of an array, slice, channel or map. With array and slices, it returns the index of the item as integer. With maps, it returns the key of the next key-value pair. Range either returns one value or two. If only one value is used on the left of a range expression, it is the 1st value in the following table.

Range expression 1st Value 2nd Value(Optional)
Array or slice a [n]E index i int a[i] E
String s string type index i int rune int
map m map[K]V key k K value m[k] V
channel c chan E element e E none

Example

The following paragraph shows how to use range −

package main

import "fmt"

func main() {
   /* create a slice */
   numbers := []int{0,1,2,3,4,5,6,7,8} 
   
   /* print the numbers */
   for i:= range numbers {
      fmt.Println("Slice item",i,"is",numbers[i])
   }
   
   /* create a map*/
   countryCapitalMap := map[string] string {"France":"Paris","Italy":"Rome","Japan":"Tokyo"}
   
   /* print map using keys*/
   for country := range countryCapitalMap {
      fmt.Println("Capital of",country,"is",countryCapitalMap[country])
   }
   
   /* print map using key-value*/
   for country,capital := range countryCapitalMap {
      fmt.Println("Capital of",country,"is",capital)
   }
}

When the above code is compiled and executed, it produces the following result −

Slice item 0 is 0
Slice item 1 is 1
Slice item 2 is 2
Slice item 3 is 3
Slice item 4 is 4
Slice item 5 is 5
Slice item 6 is 6
Slice item 7 is 7
Slice item 8 is 8
Capital of France is Paris
Capital of Italy is Rome
Capital of Japan is Tokyo
Capital of France is Paris
Capital of Italy is Rome
Capital of Japan is Tokyo

Go provides another important data type named map which maps unique keys to values. A key is an object that you use to retrieve a value at a later date. Given a key and a value, you can store the value in a Map object. After the value is stored, you can retrieve it by using its key.

Defining a Map

You must use make function to create a map.

/* declare a variable, by default map will be nil*/
var map_variable map[key_data_type]value_data_type

/* define the map as nil map can not be assigned any value*/
map_variable = make(map[key_data_type]value_data_type)

Example

The following example illustrates how to create and use a map −

package main

import "fmt"

func main() {
   var countryCapitalMap map[string]string
   /* create a map*/
   countryCapitalMap = make(map[string]string)
   
   /* insert key-value pairs in the map*/
   countryCapitalMap["France"] = "Paris"
   countryCapitalMap["Italy"] = "Rome"
   countryCapitalMap["Japan"] = "Tokyo"
   countryCapitalMap["India"] = "New Delhi"
   
   /* print map using keys*/
   for country := range countryCapitalMap {
      fmt.Println("Capital of",country,"is",countryCapitalMap[country])
   }
   
   /* test if entry is present in the map or not*/
   capital, ok := countryCapitalMap["United States"]
   
   /* if ok is true, entry is present otherwise entry is absent*/
   if(ok){
      fmt.Println("Capital of United States is", capital)  
   } else {
      fmt.Println("Capital of United States is not present") 
   }
}

When the above code is compiled and executed, it produces the following result −

Capital of India is New Delhi
Capital of France is Paris
Capital of Italy is Rome
Capital of Japan is Tokyo
Capital of United States is not present

delete() Function

delete() function is used to delete an entry from a map. It requires the map and the corresponding key which is to be deleted. For example −

package main

import "fmt"

func main() {   
   /* create a map*/
   countryCapitalMap := map[string] string {"France":"Paris","Italy":"Rome","Japan":"Tokyo","India":"New Delhi"}
   
   fmt.Println("Original map")   
   
   /* print map */
   for country := range countryCapitalMap {
      fmt.Println("Capital of",country,"is",countryCapitalMap[country])
   }
   
   /* delete an entry */
   delete(countryCapitalMap,"France");
   fmt.Println("Entry for France is deleted")  
   
   fmt.Println("Updated map")   
   
   /* print map */
   for country := range countryCapitalMap {
      fmt.Println("Capital of",country,"is",countryCapitalMap[country])
   }
}

When the above code is compiled and executed, it produces the following result −

Original Map
Capital of France is Paris
Capital of Italy is Rome
Capital of Japan is Tokyo
Capital of India is New Delhi
Entry for France is deleted
Updated Map
Capital of India is New Delhi
Capital of Italy is Rome
Capital of Japan is Tokyo

Recursion is the process of repeating items in a self-similar way. The same concept applies in programming languages as well. If a program allows to call a function inside the same function, then it is called a recursive function call. Take a look at the following example −

func recursion() {
   recursion() /* function calls itself */
}
func main() {
   recursion()
}

The Go programming language supports recursion. That is, it allows a function to call itself. But while using recursion, programmers need to be careful to define an exit condition from the function, otherwise it will go on to become an infinite loop.

Examples of Recursion in Go

Recursive functions are very useful to solve many mathematical problems such as calculating factorial of a number, generating a Fibonacci series, etc.

Example 1: Calculating Factorial Using Recursion in Go

The following example calculates the factorial of a given number using a recursive function −

package main

import "fmt"

func factorial(i int)int {
   if(i <= 1) {
      return 1
   }
   return i * factorial(i - 1)
}
func main() { 
   var i int = 15
   fmt.Printf("Factorial of %d is %d", i, factorial(i))
}

When the above code is compiled and executed, it produces the following result −

Factorial of 15 is 1307674368000

Example 2: Fibonacci Series Using Recursion in Go

The following example shows how to generate a Fibonacci series of a given number using a recursive function −

package main

import "fmt"

func fibonaci(i int) (ret int) {
   if i == 0 {
      return 0
   }
   if i == 1 {
      return 1
   }
   return fibonaci(i-1) + fibonaci(i-2)
}
func main() {
   var i int
   for i = 0; i < 10; i++ {
      fmt.Printf("%d ", fibonaci(i))
   }
}

When the above code is compiled and executed, it produces the following result −

0 1 1 2 3 5 8 13 21 34

Type casting is a way to convert a variable from one data type to another data type. For example, if you want to store a long value into a simple integer then you can type cast long to int. You can convert values from one type to another using the cast operator. Its syntax is as follows −

type_name(expression)

Example

Consider the following example where the cast operator causes the division of one integer variable by another to be performed as a floating number operation.

package main

import "fmt"

func main() {
   var sum int = 17
   var count int = 5
   var mean float32
   
   mean = float32(sum)/float32(count)
   fmt.Printf("Value of mean : %f\n",mean)
}

When the above code is compiled and executed, it produces the following result −

Value of mean : 3.400000

Go programming provides another data type called interfaces which represents a set of method signatures. The struct data type implements these interfaces to have method definitions for the method signature of the interfaces.

Syntax

/* define an interface */
type interface_name interface {
   method_name1 [return_type]
   method_name2 [return_type]
   method_name3 [return_type]
   ...
   method_namen [return_type]
}

/* define a struct */
type struct_name struct {
   /* variables */
}

/* implement interface methods*/
func (struct_name_variable struct_name) method_name1() [return_type] {
   /* method implementation */
}
...
func (struct_name_variable struct_name) method_namen() [return_type] {
   /* method implementation */
}

Example

package main

import (
   "fmt" 
   "math" 
)

/* define an interface */
type Shape interface {
   area() float64
}

/* define a circle */
type Circle struct {
   x,y,radius float64
}

/* define a rectangle */
type Rectangle struct {
   width, height float64
}

/* define a method for circle (implementation of Shape.area())*/
func(circle Circle) area() float64 {
   return math.Pi * circle.radius * circle.radius
}

/* define a method for rectangle (implementation of Shape.area())*/
func(rect Rectangle) area() float64 {
   return rect.width * rect.height
}

/* define a method for shape */
func getArea(shape Shape) float64 {
   return shape.area()
}

func main() {
   circle := Circle{x:0,y:0,radius:5}
   rectangle := Rectangle {width:10, height:5}
   
   fmt.Printf("Circle area: %f\n",getArea(circle))
   fmt.Printf("Rectangle area: %f\n",getArea(rectangle))
}

When the above code is compiled and executed, it produces the following result −

Circle area: 78.539816
Rectangle area: 50.000000

Go programming provides a pretty simple error handling framework with inbuilt error interface type of the following declaration −

type error interface {
   Error() string
}

Functions normally return error as last return value. Use errors.New to construct a basic error message as following −

func Sqrt(value float64)(float64, error) {
   if(value < 0){
      return 0, errors.New("Math: negative number passed to Sqrt")
   }
   return math.Sqrt(value), nil
}

Use return value and error message.

result, err:= Sqrt(-1)

if err != nil {
   fmt.Println(err)
}

Example

package main

import "errors"
import "fmt"
import "math"

func Sqrt(value float64)(float64, error) {
   if(value < 0){
      return 0, errors.New("Math: negative number passed to Sqrt")
   }
   return math.Sqrt(value), nil
}
func main() {
   result, err:= Sqrt(-1)

   if err != nil {
      fmt.Println(err)
   } else {
      fmt.Println(result)
   }
   
   result, err = Sqrt(9)

   if err != nil {
      fmt.Println(err)
   } else {
      fmt.Println(result)
   }
}

When the above code is compiled and executed, it produces the following result −

Math: negative number passed to Sqrt
3