Mari mulai membuat kode!!
Lihatlah kode di bawah ini dan pikirkan apa yang dicetaknya. [%T digunakan untuk mencetak info jenis]
package main import "fmt" type int1 = int // OPTION-1 type int2 int // OPTION-2 func main() { var i1 int1 var i2 int2 fmt.Printf("%T, %T", i1, i2) }
Keluaran
int, main.int2
Menariknya, i1 mencetak intdan i2mencetak main.int2.
Mengapa kita melihat keluaran ini?
i1 adalah sebuah alias. Alias adalah nama kedua untuk tipe yang sudah ada dan itu seperti mengganti semua kemunculan int1 dengan int.
Sedangkan int2 adalah definisi tipe. Perhatikan outputnya mengatakan: “main.int2”. Artinya int2 adalah tipe baru.
Apa bedanya ?
Kita perlu melihatnya dari sudut pandang berikut:
- Perilaku operasi merupakan tipe baru
Kami ingin menguji apakah tipe baru berperilaku persis seperti tipe asli int. Untuk melakukan ini, kami mencoba beberapa operasi yang didukung oleh tipe int.
package main import "fmt" type int1 = int // OPTION-1 type int2 int // OPTION-2 func main() { var i1 int1 var i2 int2 // Check if integer operations works i1 += 10 i2 += 10 i1 -= 5 i2 -= 5 // check if the new type needs an explicit type conversion var i3 int = i1 var i4 int = i2 fmt.Println(i1, i2, i3, i4) }
Keluaran
./prog.go:21:15: cannot use i2 (variable of type int2) as int value in variable declaration Go build failed.
Hal ini diharapkan berdasarkan keluaran program pertama. Tipe yang baru didefinisikan tidak bisa ditetapkan ke var int karena tipe i2 bukan int, melainkan main.int2 sebagai gantinya. Oleh karena itu kita memerlukan tipe pemeran eksplisit seperti di bawah ini dan semuanya akan berfungsi dengan baik.
package main import "fmt" type int1 = int // OPTION-1 type int2 int // OPTION-2 func main() { var i1 int1 var i2 int2 // Check if integer operations works i1 += 10 i2 += 10 i1 -= 5 i2 -= 5 // check if the new type needs an explicit type conversion var i3 int = i1 var i4 int = int(i2) // NOTICE HERE !! fmt.Println(i1, i2, i3, i4) }
Keluaran
5 5 5 5
Mari kita coba mendefinisikan metode pada tipe yang baru kita tentukan.
package main import "fmt" type int1 = int // OPTION-1 type int2 int // OPTION-2 func (i int1) ToString() string { return fmt.Sprintf("%d", i) } func (i int2) ToString() string { return fmt.Sprintf("%d", i) } func main() { }
Keluaran
./prog.go:8:7: cannot define new methods on non-local type int
Sekali lagi mirip dengan contoh sebelumnya, kode tidak berjalan dan kami mendapatkan kesalahan. Namun kali ini kesalahan adalah untuk alias tipedan bukan tipe baru yang ditentukan menggunakan definisi tipe.
Karena operasi ini sendiri tidak berhasil, kami menghapus metode func (i int1) ToString() string
dan mencoba menjalankan kode yang tersisa.
package main import "fmt" type int1 = int // OPTION-1 type int2 int // OPTION-2 func (i int2) ToString() string { return fmt.Sprintf("%d", i) } func main() { var i1 int1 var i2 int2 fmt.Println(i1, i2.ToString()) }
Keluaran
0 0
Kita telah melihat satu kesalahan dalam contoh kedua, di mana tipe yang baru didefinisikan tidak dapat ditetapkan ke tipe dasar aslinya. Mari kita lihat sisi lainnya sekarang.
package main import "fmt" type int1 = int // OPTION-1 type int2 int // OPTION-2 func main() { var i1 int1 var i2 int2 const ( c1 = 5 // untyped numeric const c2 int = 10 // typed numeric const ) // assign untyped constant i1 = c1 i2 = c1 // assign a typed constant i1 = c2 i2 = c2 // LINE-23 // assign a typed var var i int = 15 i1 = i i2 = i // LINE-28 fmt.Println(i1, i2) }
Keluaran
./prog.go:23:7: cannot use c2 (constant 10 of type int) as int2 value in assignment ./prog.go:28:7: cannot use i (variable of type int) as int2 value in assignment Go build failed.
"sumber"
Pesan kesalahannya cukup jelas.
Namun Anda harus memperhatikan bahwa i2 = c2
gagal sedangkan i2 = c1
tidak. Itu karena go melakukan pencocokan tipe yang ketat. Jadi untuk konstanta yang diketik (c2) atau untuk variabel yang diketik (baris 28), tipe harus cocok sedangkan untuk konstanta yang tidak diketik (c1), tipe dapat disimpulkan dalam ekspresi jika kompatibel.
Aplikasi
Ketik Alias
Ini hanya dapat digunakan untuk mendefinisikan nama lain (alias 😝) yang dapat digunakan sebagai pengganti nama asli. Kapan Anda akan melakukannya ?
Jika Anda tidak menyukai nama tipe aslinya, mungkin terlalu panjang lebar🙈.
Sebenarnya ada alasan sah untuk melakukan hal ini, lihat “bahan bacaan” di bagian akhir.
atau mungkin Anda ingin memberi tahu dunia bahwa Anda telah menulis kode ini 🤣
package main import "fmt" type gaurav = int func main() { var leangaurav gaurav leangaurav++ fmt.Println(leangaurav) }
Jenis Definisi
Mungkin ada alasan lain untuk menggunakan definisi tipe, tapi salah satunya adalah menggunakan definisi tipe untuk perilaku seperti enum. Seperti contoh dari go spec yang sedikit dimodifikasi untuk memudahkan pemahaman. Periksa spesifikasi untuk membaca kode aslinya.
type TimeZone int const ( EST TimeZone = -5 CST TimeZone = -6 MST TimeZone = -7 PST TimeZone = -8 ) func (tz TimeZone) String() string { return fmt.Sprintf("GMT%+dh", tz) }
Bahan bacaan lainnya tentang alias tipe dan definisi tipe
Cobalah bermain-main dengan contoh-contoh itu sendiri karena masih banyak lagi yang bisa dijelajahi.
Anda dapat menemukan saya di Linkedin 👋🏻👋🏻.