Golang 1 - Interfaces - Giới thiệu


Written on January 1, 2024

Interface là gì

Trong Go, interface là một tập hợp các method signatures. Khi một type định nghĩa tất cả các methods trong một interface, nó đợi nói là đã implemennt interface đó. Tương đương trong OOP, interface đinh nghĩa method type phải có, việc implement như thế nào phụ thuộc vào type

Declaring and implementing an interface

package main

import (
	"fmt"
)

//interface definition
type VowelsFinder interface {
	FindVowels() []rune
}

type MyString string

//MyString implements VowelsFinder
func (ms MyString) FindVowels() []rune {
	var vowels []rune
	for _, rune := range ms {
		if rune == 'a' || rune == 'e' || rune == 'i' || rune == 'o' || rune == 'u' {
			vowels = append(vowels, rune)
		}
	}
	return vowels
}

func main() {
	name := MyString("Sam Anderson")
	var v VowelsFinder
	v = name // possible since MyString implements VowelsFinder
	fmt.Printf("Vowels are %c", v.FindVowels())

}

Chương trình trên, chúng ta tạo một interface tên là VowelsFinder có duy nhất hàm FindVowels trả về []rune

Type MyString được tạo và add method FindVowels() []rune với 1 receiver type là MyString. Bây giờ chúng ta có thể nói MyString implement interface VowelFinder. Chúng ta có thể để ý thấy, khác với ngôn ngữ khác như Java, không có một khai báo tường minh nào. Đều đó không cần thiết trong Go, inteface trong Go đươc implement một cách không tường minh. Nếu một type có tất cả các hàm của interface, nó sẽ là một implement của interface đó.

Ứng dụng của interface.

Interface internal representation

Một interface có thể đại diện bằng một tuple (type, value). type là kiểu cụ thể của interface, và value là giá trị và type đang năm giữ.

Empty interface

Một interface không có method nào được gọi là empty interface, nó đại điện bởi interface{}. Vì empty interface không có method nào, mọi type đều implement empty interface.

Type assertion

i.(T) => lấy giá trị của interface i mà có type cụ thể là T.