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

sumber

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:

  1. 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.

sumber

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

2. Mendefinisikan operasi/metode baru

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

sumber

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

3. Operasi penugasan

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

  1. https://go.dev/talks/2016/refactor.article

Cobalah bermain-main dengan contoh-contoh itu sendiri karena masih banyak lagi yang bisa dijelajahi.

Anda dapat menemukan saya di Linkedin 👋🏻👋🏻.