做網站開發(fā)有什么專業(yè)證seo專家是什么意思
泛型
- 對于強類型語言,在編寫代碼時不事先指定類型,在實例化的時候作為參數指明類型
參考:https://www.liwenzhou.com/posts/Go/generics/
什么時候使用泛型?
- 方法中的代碼實現與類型T無關
- 參考:https://juejin.cn/post/7089321525781725214
- interface與泛型
- 操作沒有方法的類型,interface類型不適用
- 每個類型的操作邏輯不一樣,泛型不適用
泛型與繼承的區(qū)別
- 參考:https://www.cnblogs.com/wdmx/p/9922371.html
- 泛型是指廣泛的類型,是橫向的
- 用在與類型無關的函數中
- 比如函數將相同的算法作用到不同的類型上,類型在使用的時候再確定
- 用在與類型無關的函數中
- 繼承是垂直的
- 不同的類型之間有了共同的方法,會抽象出來一個父類。
- 多態(tài),相同的方法,不同的實現
- 我的理解
- 繼承:不同的對象,有相同的方法名,但是實現不同,屬于同一個類
- 泛型:不同的對象,作用在他們身上的邏輯相同,與他們的類型無關,可用泛型。
方法與函數
- 參考:https://juejin.cn/post/6894899185221697550
- 方法是包含了接受者的函數
- 方法屬于類
- 函數就是代碼集合
泛型與interface?
- interface可以認為是基類,走繼承的那條道
- interface也可以實現泛型
- 參考:https://golang3.eddycjy.com/posts/generics-history/
- interface在類型上太隨意
- 比如add(a,b),a,b應該是同一類型,但是調用的時候我可以傳入不同類型,為了不出問題,還得在函數里面做類型判斷
- 泛型在編譯時有類型校驗
- 泛型相較于接口的優(yōu)點
- 更安全:編譯早期發(fā)現錯誤
- 更高效:靜態(tài)類型
- interface在類型上太隨意
代碼示例
package mainimport "log"//繼承type StructBase interface {GetName() string
}type StructA struct {Name stringColumnA string
}func (a StructA) GetName() string {return a.Name
}type StructB struct {Name stringColumnB string
}func (b StructB) GetName() string {return b.Name
}func PrintName(s StructBase) {log.Println(s.GetName())
}// 泛型
func reverse(arr []int) []int {res := make([]int, len(arr))for i := len(arr) - 1; i >= 0; i-- {res[len(arr)-1-i] = arr[i]}return res
}func reverseGeneric[T any](arr []T) []T {res := make([]T, len(arr))for i := len(arr) - 1; i >= 0; i-- {res[len(arr)-1-i] = arr[i]}return res
}func main() {//泛型測試arr := []int{1, 2, 3, 4, 5}log.Println(reverse(arr))log.Println(reverseGeneric(arr))log.Println(reverseGeneric(arr))log.Println(reverseGeneric([]int{1, 2, 3, 4, 5}))arr2 := []string{"a", "b", "c", "d", "e"}log.Println(reverseGeneric(arr2))//繼承測試log.Println("=========================================")PrintName(StructA{Name: "structA", ColumnA: "columnA"})PrintName(StructB{Name: "structB", ColumnB: "columnB"})}