go語法入門泛型type?parameters簡稱T(類型形參)兩種場景使用
一、介紹
go在1.18終于加上了泛型。那么在之前,我們都沒有用10幾年了,一直用。
加上泛型后,到底好處在哪里呢,解決了那些場景的痛點呢?
泛型主要在于歸納,泛型-代表可以多余一種類型。
作為入門的文章,主要介紹兩種泛型的使用場景
泛型允許在函數(shù)和類型的實現(xiàn)中使用某個類型集合中的任何一種類型。
目前 “類型形參” (type parameters),簡稱 T
- 面向函數(shù),作為參數(shù)
- 面向結構體,作為結構體里面字段的類型
1.1 面向函數(shù),作為參數(shù)
我們來看一下,在比較兩個數(shù)的大小時,沒有泛型的時候,僅僅只是傳入類型不一樣,我們就要再寫一份一模一樣的函數(shù)。
// maxInt64 獲取j,j中的最大值 func maxInt64(i, j int64) int64 { if i >= j { return i } return j } // maxInt32 獲取j,j中的最大值 func maxInt32(i, j int32) int32 { if i >= j { return i } return j }
此時代碼的邏輯一樣,只是類型不一樣,我們可以使用“類型形參” (type parameters),簡稱 T
來代表int32
或者int64
。
類型形參type parameters簡稱T
語法為:
[T int32 | int64]
這樣的語法,我們用 類型形參T
來代表int32
或者int64
類型。
上面的
maxInt64(i, j int64) int64 maxInt32(i, j int32) int32
我們使用 類型形參T
來替換為:
func maxInt32orInt62[T int32 | int64](i, j T) T { if i >= j { return i } return j } func TestMaxInt32orInt62(t *testing.T) { var i1, j1 int32 = 1, 3 t.Log(maxInt32orInt62(i1, j1)) var i2, j2 int64 = 11, 3 t.Log(maxInt32orInt62(i2, j2)) }
輸出:
=== RUN TestMaxInt32orInt62
3
11
--- PASS: TestMaxInt32orInt62 (0.00s)
在參數(shù)方面 i, j的類型變?yōu)?code>T,以及返回值的類型也是 T
因為我么在前面定義了
[T int32 | int64]
用T來代表int32
或者int64
.
1.2 面向結構體,作為結構體里面字段的類型
我們先看一下正常結構體的寫法如下:
type sumInt struct { Num int64 } func (s sumInt) Sum() int64 { return s.Num } type sumFloat struct { Num float64 } func (s sumFloat) Sum() float64 { return s.Num } func TestSumIntOrFloat(t *testing.T) { i := sumInt{Num: 100} t.Log(i.Sum()) f := sumFloat{Num: 100.0} t.Log(f.Sum()) }
輸出:
=== RUN TestSumIntOrFloat
100
100
--- PASS: TestSumIntOrFloat (0.00s)
我們發(fā)現(xiàn)Num的類型為int64
或float64
,我們在這里準備用“類型形參” (type parameters),簡稱 T
來代替他們。
[T int64 | float64]
修改為如下:
type sumIntOrFloat[T int64 | float64] struct { Num T } func (s sumIntOrFloat[T]) Sum() T { return s.Num } func TestSumIntOrFloat(t *testing.T) { i := sumIntOrFloat[int64]{Num: 100} t.Log(i.Sum()) f := sumIntOrFloat[float64]{Num: 100.0} t.Log(f.Sum()) }
輸出:
=== RUN TestSumIntOrFloat
100
100
--- PASS: TestSumIntOrFloat (0.00s)
以上就是go語法入門泛型type parameters簡稱T(類型形參)兩種場景使用的詳細內容,更多關于go泛型type parameters的資料請關注腳本之家其它相關文章!
相關文章
Go語言學習筆記之golang操作MongoDB數(shù)據(jù)庫
MongoDB是Nosql中常用的一種數(shù)據(jù)庫,這篇文章主要給大家介紹了關于Go語言學習筆記之golang操作MongoDB數(shù)據(jù)庫的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-05-05Go語言 channel如何實現(xiàn)歸并排序中的merge函數(shù)詳解
這篇文章主要給大家介紹了關于Go語言 channel如何實現(xiàn)歸并排序中merge函數(shù)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-02-02GoRoutines高性能同時進行多個Api調用實現(xiàn)
這篇文章主要為大家介紹了GoRoutines高性能同時進行多個Api調用實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03