Data Type - RealYukiSan/explore-go GitHub Wiki

Struct

Merupakan sebuah tipe data key-value pair, mungkin dapat di sama kan dengan object? tapi sepertinya under the hood behaviour-nya berbeda

struct pada golang dapat di implementasikan dengan berbagai cara, untuk melihat metode-metode pengimplementasianya silahkan kunjungi commit ini


adapun struct yang tidak mengandung property apapun alias kosong, biasanya digunakan sebagai return value yang void seperti contoh berikut:

type Success struct{}
type Failure struct{}

func DoSomething() interface{} {
    if success {
        return Success{}
    } else {
        return Failure{}
    }
}

contoh kode di atas mungkin akan berguna jika ada method yang di-bind pada struct kosong tersebut sehingga return value nya dapat di casting dan di panggil method yang berkaitan dengan salah satu struct tersebut (?)


dan perlu diingat juga, bahwa struct yang belum di assign, default valuenya adalah zero-value berdasarkan data tipenya masing2, seperti jika string maka zero-value nya adalah empty string "" dimana jika value tersebut di print tidak akan mengeluarkan apa2.


di golang juga struct dapat di inheritkan, contohnya dapat dilihat pada commit ini


pembelajaran penting dalam section ini adalah: saya jadi menyadari bahwa keyword var dan type di golang itu ternyata penting. Dimana dengan keyword var anda dapat membuat sebuah variabel, sedangkan keyword type hanya membuat tipe saja. Tetapi yang unik di golang adalah keyword type dapat di assign pada sebuah variabel dimana typescript tidak bisa melakukan itu :v


tetapi asssign type pada variabel juga memiliki sebuah persyaratan, yaitu harus assign value pada saat yang bersamaan

// hanya deklarasi
var student struct {
    grade int
}

// deklarasi sekaligus inisialisasi
var student = struct {
    grade int
} {
    12,
}

kita juga dapat membuat sebuah tag property pada struct, tag property itu singkatnya seperti aliases untuk mengakses prop tersebut (?)

type person struct {
    name string `tag1`
    age  int    `tag2`
}

umumnya penggunaan tag ini sering digunakan pada saat bermain dengan json dan bisa diakses pula melewati reflect :>

dan ada satu lagi teknik yang sering dipakai ketika bermain dengan json, yaitu penulisan struct secara nested seperti berikut

type student struct {
    person struct {
        name string
        age  int
    }
    grade   int
    hobbies []string
}

untuk mengkonversi data json agar dapat digunakan pada golang, anda dapat menkonversinya menjadi struct ataupun map[string]interface{} untuk melihat bagaimana cara mengolah sebuah data json, silahkan kunjungi commit ini


kita juga dapat membuat type alias pada sebuah struct

type Person struct {
    name string
    age  int
}
type People = Person

teknik tersebut dapat berguna jika kita melakukan casting type pada satu tipe ke tipe lain:

people := People{"wick", 21}
fmt.Println(Person(people))

person := Person{"wick", 21}
fmt.Println(People(person))

jadi fungsi ini sangat berguna untuk fleksibilitas, dan perlu di ingat type alias dapat dilakukan pada semua tipe data, tidak hanya struct saja.

Array

merupakan sebuah tipe data yang berisi kumpulan/collection dari berbagai native tipe data seperti bool, string, number, dll maupun non-native seperti fungsi, struct, dll dalam bahasa pemrograman ada beberapa tipe data lainnya yang termasuk kedalam keluarga array, jika di javascript seperti map, set (?). dan jika di golang itu ada slice, dan di python dictionary, dll (?) lalu apa perbedaan antara slice dan array di golang? silahkan simak tabel berikut untuk memahami perbedaannya:

Array Slice
kumpulan nilai atau elemen referensi dari tiap elemen tersebut - untuk membuat sebuah referensi kesebuah array/slice lain kamu dapat menggunakan teknik 2 index seperti array[startIndex:beforeIndex]
ukuran / length untuk alokasinya wajib ditentukan pada saat deklarasi opsional
tetapi lengthnya dapat diset otomatis dengan syarat declare+assign secara bersamaan tidak memerlukan persyaratan tersebut
- merupakan sebuah tipe data reference - perubahan yang ada pada slice akan berdampak pada slice lain yang memiliki alamat memory yang sama

fungsi utilitas yang biasa digunakan pada slice

Len Cap
return jumlah item/length yang tersedia saat ini return max kapasitas yang dapat ditampung - kapasitas dapat berubah jika start indexnya berubah juga, tetapi tidak akan berpengaruh pada beforeIndex

Slice

Perlu diperhatikan bahwa slice literal pada dasarnnya reference ke array, namun secara implicit


Map

Merupakan keluarga array juga, namun dia itu array asosiatif, sama seperti array asosiatif pada php, sayangnya javascript tidak punya array assoc ya, kasian langsung di convert ke object aowkawo :v. Berbeda dengan syntax type pada typescript, di golang anda dapat menuliskan type dan valuenya (walau valuenya kosong juga bisa) secara inline lhooo, anjay ga tuh 😂

var data map[string]int // map berisi nil tapi di print ga keluar nil nya bjir :v 
data["one"] = 1 // karna isi mapnya nil tidak bisa assign 😂
// maka akan muncul error panic!

data = map[string]int{}  // map berisi zero value dari int = 0? ntahlah kawan :v
data["one"] = 1
// tidak ada error karena map nil-nya dah di replace oleh operasi assignment di atas 😂

walau sama-sama key-value pair, tetapi map dan struct bukanlah hal yang sama, untuk melihat perbedaan antara Map dan Struct silahkan perhatikan tabel berikut:

Map Struct
sebuah slice asosiatif like an object
pointer type value type
can iterate with for range loop doesn't support for range loop (but in js you can do it lol :v)
kalo value-nya di definisikan sebagai int, ya int semua boleh campur-campur koq!

untuk contoh pengimplementasian: array, slice dan map bisa kamu kunjungi di commit ini: array slice map map+slice


  1. saya juga menyadari bahwa sepertinya setiap tipe data yang non-primitive / non-vanilla itu dapat di kombinasikan ya (?) seperti kombinasi antara struct, map, slice, dll
  2. dan juga saya menyadari hal penting lainnya, bahwa kita perlu mengetahui beberapa hal berikut:
  • pass by value
  • pass by reference
  • pointer type / reference type vs copy type (duplikat data not pointer)
  1. saya jadi menyadari bahwa variable yang diberi prefix _ akan di ignore oleh compiler, sehingga menjadi lebih efesien (?)

referensi:

⚠️ **GitHub.com Fallback** ⚠️