客户管理系统开发定制go泛型使用方法

golang客户管理系统开发定制泛型使用方法

1. 客户管理系统开发定制泛型是什么

  • 客户管理系统开发定制泛型只在编译期,客户管理系统开发定制旨在为程序员生成代码,减少重复代码的编写

  • 在比较两个数的大小时,没有泛型的时候,仅仅只是传入类型不一样,我们就要再写一份一模一样的函数,如果有了泛型就可以减少这类代码

// intfunc GetMaxNumInt(a, b int) int {	if a > b {		return a	}	return b}// int8func GetMaxNumInt8(a, b int8) int8 {	if a > b {		return a	}	return b}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

2. 泛型的简单使用

2.1. 泛型示例

  • 需要go版本大于等于1.18
  • 我们先改造一下上面的示例,只需要在函数后用中括号声明T可能出现的类型,中间用符号"|" 分隔
// 使用泛型func GetMaxNum[T int | int8](a, b T) T {	if a > b {		return a	}	return b}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.2. 自定义泛型类型

  • 如果类型太多了怎么办呢?这时候我们就可以自定义泛型类型
// 像声明接口一样声明type MyInt interface {	int | int8 | int16 | int32 | int64}// T的类型为声明的MyIntfunc GetMaxNum[T MyInt](a, b T) T {	if a > b {		return a	}	return b}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.3. 调用带泛型的函数

  • 如何调用这个带有泛型的函数呢?
var a int = 10var b int = 20// 方法1,正常调用,编译器会自动推断出传入类型是intGetMaxNum(a, b)// 方法2,显式告诉函数传入的类型是intGetMaxNum[int](a, b)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3. 自定义泛型类型的语法

在2.2小节中我们可以看到一个泛型的简单自定义类型,本节将会详细描述泛型自定义类型的语法

3.1. 内置的泛型类型any和comparable

  • any: 表示go里面所有的内置基本类型,等价于interface{}
  • comparable: 表示go里面所有内置的可比较类型:int、uint、float、bool、struct、指针等一切可以比较的类型

3.2. 声明一个自定义类型

  • 跟声明接口一样,使用type x interface{} 关键字来声明,不过里面的成员不再是方法,而是类型,类型之间用符号 "|" 隔开
type MyInt interface {	int | int8 | int16 | int32 | int64}
  • 1
  • 2
  • 3
  • 成员类型支持go中所有的基本类型
type MyT interface {	int | float32 | bool | chan int | map[int]int | [10]int | []int | struct{} | *http.Client}
  • 1
  • 2
  • 3

3.3. 泛型中的"~"符号是什么

  • 符号"~"都是与类型一起出现的,用来表示支持该类型的衍生类型
// int8的衍生类型type int8A int8type int8B = int8// 不仅支持int8, 还支持int8的衍生类型int8A和int8Btype MyInt interface {	~int8}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4. 泛型的进阶使用

4.1. 泛型与

  • 创建一个带有泛型的结构体User,提供两个获取agename的方法
  • 注意:只有在结构体上声明了泛型,结构体方法中才可以使用泛型
type AgeT interface {	int8 | int16}type NameE interface {	string}type User[T AgeT, E NameE] struct {	age  T	name E}// 获取agefunc (u *User[T, E]) GetAge() T {	return u.age}// 获取namefunc (u *User[T, E]) GetName() E {	return u.name}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 我们可以通过声明结构体对象时,声明泛型的类型来使用带有泛型的结构体
// 声明要使用的泛型的类型var u User[int8, string]// 赋值u.age = 18u.name = "weiwei"// 调用方法age := u.GetAge()name := u.GetName()// 输出结果 18 weiweifmt.Println(age, name) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

5. 泛型的限制或缺陷

5.1 无法直接和switch配合使用

  • 将泛型和switch配合使用时,无法通过编译
func Get[T any]() T {	var t T	switch T {	case int:		t = 18	}	return t}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 只能先将泛型赋值给interface才可以和switch配合使用
func Get[T any]() T {	var t T	var ti interface{} = &t	switch v := ti.(type) {	case *int:		*v = 18	}	return t}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发