go基礎(二) 泛型


go 語言支持泛型納入了 go2 的規划 在線體驗 https://go2goplay.golang.org/

本文是 go 泛型的實踐過程詳解

這是一篇不錯的 泛型介紹 Go 語言:全面分析為什么我們需要泛型  - 講解了泛型的優點、缺點、和 go 在泛型上的實現方案。本文不再具體介紹

簡單說 泛型是與類型無關的算法。

實踐過程

1.  編譯 go 安裝包 dev.go2go 分支
2.  安裝新編譯的 go 程序
3.  使用新的 go 編譯泛型代碼(文件后綴名.go2)
4.  例子一 print.go2

package main
import (
    "fmt"
)
func Print[T any](s []T) {
    for _, v := range s {
        fmt.Print(v)
    }
}
func main() {
    Print([]string{"Hello, ", "playground\n"})
}

5.  執行 go tool go2go run filename.go2

6.  例子二 indexof.go2

package main
import (
     "fmt"
)
func IndexOf[T comparable](arr []T, value T) int {
    for i, v := range arr {
        if v == value {
            return i
        }
    }

    return -1
}
func main() {
     q := []uint{1,2,3,4,5}
     fmt.Println(IndexOf(q, 5)) // 5
     str := []string{"xi","an","shi","gao","xin","qu"}
     fmt.Println(IndexOf(str,"gao")) // 3
     fmt.Println(IndexOf(str,"xii")) // -1
}

 7. go tool go2go translate indexof.go2 將 .go2 文件 翻譯成 .go 文件

根據翻譯得來的 .go 文件 印證了 Go 語言:全面分析為什么我們需要泛型 中所講的 go 實現泛型是根據模板進行實例化代碼  

// Code generated by go2go; DO NOT EDIT.


//line indexof.go2:1
package main

//line indexof.go2:1
import "fmt"

//line indexof.go2:17
func main() {
	q := []uint{1, 2, 3, 4, 5}
	fmt.Println(instantiate୦୦IndexOf୦uint(q, 5))
	str := []string{"xi", "an", "shi", "gao", "xin", "qu"}
	fmt.Println(instantiate୦୦IndexOf୦string(str, "gao"))
	fmt.Println(instantiate୦୦IndexOf୦string(str, "xii"))
}
//line indexof.go2:7
func instantiate୦୦IndexOf୦uint(arr []uint, value uint,) int {
	for i, v := range arr {
		if v == value {
			return i
		}
	}

	return -1
}
//line indexof.go2:7
func instantiate୦୦IndexOf୦string(arr []string, value string,) int {
	for i, v := range arr {
		if v == value {
			return i
		}
	}

	return -1
}

//line indexof.go2:15
type Importable୦ int

//line indexof.go2:15
var _ = fmt.Errorf

 8. 泛型的范圍 - func IndexOf[T comparable](arr []T, value T)
    1.  comparable 可比較的
    ```go
    func IndexOf[T comparable](arr []T, value T) int {
        for i, v := range arr {
            if v == value {
                return i
            }
        }

        return -1
    }
    ```
    2.  any 任意的
    ```go
    func Print[T any](s []T) {
        for _, v := range s {
            fmt.Print(v)
        }
    }
    ```
    3.  自定義
    ```go
    type numeric interface { // 支持的類型
        type string,int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64
    }

    func min[T numeric](a, b T) T {
        if a < b {
            return a
        }
        return b
    }
    ```

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM