Hai Guys... ketemu lagi dengan saya... Gimana nih kabarnya baik-baik saja kan.
Ok, kali ini saya ingin share episode 2 dari belajar bahasa pemrograman Go.
Kali ini saya ingin berbagi tentang Array.
Apa sih array itu?
Array merupakan struktur data yang memperbolehkan menyimpan satu atau lebih nilai secara berurutan. Array memiliki 2 bagian penting, yaitu indeks (yang umumnya dimulai dari 0) dan value (yaitu nilai yang disimpan pada indeks tertentu).
Array dibagi menjadi beberapa jenis,diantaranya:
● fixed array, yaitu array yang tidak bisa diubah ukurannya
● dynamic array, yaitu array yang dapat berubah ukurannya
● 1dimension array, yaitu array 1dimensi (hanya terdapat 1 row)
● multidimension array, yaitu array n-dimensi (terdapat banyak row, layer, dst)
● bit-array (atau bitset, bitstring, bitvector), yaitu array yang hanya menyimpan bit (0/1)
● parallel-array, yaitu 2 atau lebih array yang merepresentasikan array of records
● variable-length array (VLA), yaitu array yang ukurannya ditentukan pada saat runtime, pada
bahasa C, didukung sejak standar C99,
● sparse array, yaitu array yang memiliki nilai mayoritas sama (biasanya 0), sehingga hanya
perlu menyimpan 3 nilai, yaitu nilai default, posisi dan value yang berbeda
● jagged array (iliffe vector), yaitu array multidimensi dimana panjang row/layernya boleh
berbeda-beda
● associative array (map, symbol table, dictionary), yaitu array yang indeksnya tidak harus
integer dan tidak harus urut
Array Slicing
Array slicing merupakan operasi yang dilakukan untuk mengambil sejumlah elemen dari suatu array
sebagai array lain. Berikut ini contoh penggunaan slice pada bahasa Go:
n:=[]int{1,3,5,7,8,13,20}
a:=n[:3] //[]int{1,3,5}
b:=n[2:5]//[]int{5,7,8}
c:=n[4:] //[]int{8,13,20}
d:=n[:] //[]int{1,3,5,7,8,13,20}
fmt.Println("n=",n)
fmt.Println("a=",a)
fmt.Println("b=",b)
fmt.Println("c=",c)
fmt.Println("d=",d)
a[0],b[0],c[0]=11,22,33
fmt.Println("n=",n)
fmt.Println("a=",a)
fmt.Println("b=",b)
fmt.Println("c=",c)
fmt.Println("d=",d)
Pada contoh di atas, tiap perubahan elemen pada slice, akan mempengaruhi array asli (sumber slice).
Untuk membuat array, dapat mempergunakan beberapa syntax, misal:
n1:=[...]int{1,2,3}
n2:=[3]int{1,2,3}
var n3[3]int=[...]int{1,2,3}
var n4[3]int=[3]int{1,2,3}
Berbeda dengan array pada C dan bahasa lainnya, array pada Go bukanlah reference type, yang
artinya tanda sama dengan akan melakukan copy semua elemen di dalam array. Terdapat beberapa
cara untuk membuat slice, misal:
s1:=[]int{1,2,3}
s2:=make([]int,3,3)//length,max-capacity
s3:=make([]int,3)
Untuk mengetahui ukuran suatu variabel pada Go, dapat digunakan package unsafe, yaitu dengan
perintah unsafe.Sizeof(variable). Bentuk representasi internal suatu slice adalah:
Member ptr merupakan pointer menuju fixed array sesungguhnya, member len merupakan panjang
sekarang yang visible, sedangkan member capmerupakan kapasitas maksimum dari array yang
ditunjuk oleh slice. Sebagai contoh, apabila kita menulis s := make([]byte,5), maka terbentuklah
data berikut ini pada memori:
apabila ditulis s=s[2:4], maka slice yang baru akan menjadi seperti gambar berikut:
Di bawah merupakan contoh program yang sudah komplit:
package main
import (
"fmt"
)
func main() {
// creates an array of five ints.
// specified length must be a compile-time constant expression.
// this allows compiler to do efficient bounds checking.
var a [5]int
// since length is compile-time constant, len() is a compile time constant
// and does not have the overhead of a function call.
fmt.Println("len(a) =", len(a))
// elements are always initialized to 0
fmt.Println("a =", a)
// assign a value to an element. indexing is 0 based.
a[0] = 3
fmt.Println("a =", a)
// retrieve element value with same syntax
fmt.Println("a[0] =", a[0])
// a slice references an underlying array
s := a[:4] // this does not allocate new array space.
fmt.Println("s =", s)
// slices have runtime established length and capacity, but len() and
// cap() are built in to the compiler and have overhead more like
// variable access than function call.
fmt.Println("len(s) =", len(s), " cap(s) =", cap(s))
// slices can be resliced, as long as there is space
// in the underlying array.
s = s[:5]
fmt.Println("s =", s)
// s still based on a
a[0] = 22
fmt.Println("a =", a)
fmt.Println("s =", s)
// append will automatically allocate a larger underlying array as needed.
s = append(s, 4, 5, 6)
fmt.Println("s =", s)
fmt.Println("len(s) =", len(s), " cap(s) =", cap(s))
// s no longer based on a
a[4] = -1
fmt.Println("a =", a)
fmt.Println("s =", s)
// make creates a slice and allocates a new underlying array
s = make([]int, 8)
fmt.Println("s =", s)
fmt.Println("len(s) =", len(s), " cap(s) =", cap(s))
// the cap()=10 array is no longer referenced
// and would be garbage collected eventually.
}
len(a) = 5
a = [0 0 0 0 0]
a = [3 0 0 0 0]
a[0] = 3
s = [3 0 0 0]
len(s) = 4 cap(s) = 5
s = [3 0 0 0 0]
a = [22 0 0 0 0]
s = [22 0 0 0 0]
s = [22 0 0 0 0 4 5 6]
len(s) = 8 cap(s) = 10
a = [22 0 0 0 -1]
s = [22 0 0 0 0 4 5 6]
s = [0 0 0 0 0 0 0 0]
len(s) = 8 cap(s) = 8
String
String umumnya juga mengimplementasikan array di dalamnya, terdapat berbagai fungs string, yang terdapat pada paket strings, contoh:
● func Contains(s,substrstring)bool
untuk memeriksa apakah substr ada di dalam s
● func ContainsAny(s,charsstring)bool
untuk memeriksa apakah karakterkarakter chars ada di dalam s
● func ContainsRune(sstring,rrune)bool
untuk memeriksa apakah karakter r ada di dalam s
● func Count(s,sepstring)int
untuk memeriksa jumlah substring sep di dalam s
● func Fields(sstring)[]string
funcFieldsFunc(sstring,ffunc(rune)bool)[]string
untuk memecah string s menjadi array of string berdasarkan whitespace atau fungsi f
● func HasPrefix(s,prefixstring)bool
funcHasSuffix(s,suffixstring)bool
untuk memeriksa apakah s memiliki awalan prefix / akhiran suffix
● func Index(s,sepstring)int
funcLastIndex(s,sepstring)int
untuk mengembalikan indeks dari awal substring sep di dalam s
● func IndexAny(s,charsstring)int
funcLastIndexAny(s,charsstring)int
untuk mengembalikan indeks pertama/terakhir dari salah satu karakter chars di dalams
● func IndexByte(sstring,cbyte)int
untuk mengembalikan indeks dari byte c di dalam s
● func IndexFunc(sstring,ffunc(rune)bool)int
funcLastIndexFunc(sstring,ffunc(rune)bool)int
untuk mengembalikan indeks dari karakter pertama/terakhir yang mengembalikan true dari fungsi f
● func IndexRune(sstring,rrune)int
untuk mengembalikan indeks dari karakter r
● func Join(a[]string,sepstring)string
untuk menggabungkan array of string menjadi string
● func Map(mappingfunc(rune)rune,sstring)string
untuk mengganti tiap karakter sesuai fungsi mapping, apabila nilai kembalian fungsi negatif,
maka karakter tersebut akan dihapus
● func Repeat(sstring,countint)string
untuk mengulangi string tertentu sejumlah count kali
● func Replace(s,old,newstring,nint)string
untuk mengganti tiap substring old menjadi new sejumlah n kali, apabila n berisi 0, maka tidak ada batas maksimal penggantian
● func Split(s,sepstring)[]string
func SplitAfter(s,sepstring)[]string
func SplitAfterN(s,sepstring,nint)[]string
func SplitN(s,sepstring,nint)[]string
untuk memecah string berdasarkan substring sep
● func ToLower(sstring)string
func ToTitle(sstring)string
func ToUpper(sstring)string
untuk mengubah case dari karakterkarakter di dalam string● funcTrim(sstring,cutsetstring)string
func TrimFunc(sstring,ffunc(rune)bool)string
func TrimLeft(sstring,cutsetstring)string
func TrimLeftFunc(sstring,ffunc(rune)bool)string
func TrimPrefix(s,prefixstring)string
func TrimRight(sstring,cutsetstring)string
func TrimRightFunc(sstring,ffunc(rune)bool)string
func TrimSpace(sstring)string
func TrimSuffix(s,suffixstring)string
untuk menghapus karakterkarakter tertentu dari awal/akhir/keseluruhan string
Associative String
Contoh di bawah merupakan associative array biasa
// declare a nil map variable, for maps from string to int
var x map[string]int
// make an empty map
x = make(map[string]int)
// make an empty map with an initial capacity
x = make(map[string]int, 42)
// set a value
x["foo"] = 3
// getting values
y1 := x["bar"] // zero value returned if no map entry exists for the key
y2, ok := x["bar"] // ok is a boolean, true if key exists in the map
// removing keys
delete(x, "foo")
// make a map with a literal
x = map[string]int{
"foo": 2, "bar": 42, "baz": -1,
}
Contoh di bawah merupakan associative array yang iteration.
myMap := map[string]int {
"hello": 13,
"world": 31,
"!" : 71 }
// iterating over key-value pairs:
for key, value := range myMap {
fmt.Printf("key = %s, value = %d\n", key, value)
}
// iterating over keys:
for key := range myMap {
fmt.Printf("key = %s\n", key)
}
// iterating over values:
for _, value := range myMap {
fmt.Printf("value = %d\n", value)
}
Okaya, mungkin sekian dulu sharing dari saya, kita bakal ketemu lagi di sharing berikutnya.
Sumber:
http://rosettacode.org/wiki/Arrays#Go,
http://blog.golang.org/go-slices-usage-and-internals_slice-struct.png,
http://blog.golang.org/go-slices-usage-and-internals_slice-2.png,
http://blog.golang.org/go-slices-usage-and-internals_slice-1.png,
materi dari dosen,
http://rosettacode.org/wiki/Associative_array/Creation#Go,
http://rosettacode.org/wiki/Associative_array/Iteration#Go.