Golang 1 - Interfaces - Giới thiệu
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
.