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.
Okaya, mungkin sekian dulu sharing dari saya, kita bakal ketemu lagi di sharing berikutnya.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) }
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.
No comments:
Post a Comment