golang中使用泛型

泛型支持

go >= 1.18

为什么需要泛型

编写一个函数用来比较两个数的大小,对于golang这种强类型的语言,要么针对不同的类型分别实现一遍,要么使用 interface{} 类型。

func CompareInt64(a, b int64) bool {
	if a >= b {
		return true
	} else {
		return false
	}
}

func CompareFloat64(a, b float64) bool {
	if a >= b {
		return true
	} else {
		return false
	}
}

func Compare(a, b interface{}) bool {
	switch a.(type) {
	case int64:
		a1 := a.(int64)
		b1 := b.(int64)
		if a1 >= b1 {
			return true
		} else {
			return false
		}
	case float64:
		a1 := a.(float64)
		b1 := b.(float64)
		if a1 >= b1 {
			return true
		} else {
			return false
		}
	default:
		return false
	}
}

显然 interface{} 类型会打破强类型的约束,使程序暴露更多的错误。

如果引入泛型就可以将 CompareInt64CompareFloat64 整合成一个函数。

定义泛型函数

golang支持泛型函数和泛型类型。

// 泛型函数
func GenericFunc[T any](args T) {
	  
}

[T any]为类型约束,any 表示任意类型,(args T)为参数。

如果只想支持特定的几个类型可以这样写。

func GenericFunc[T int64|float64](args T) {
	  
}

如果类型太多了,可以这样表示

type Number interface{
	int | int32 | int64 | float64 | float32 
}

func GenericFunc[T Number](args T) {
	  
}

有时候需要类型可以进行算数运算,但是any中有些类型又是不支持的,因此需要用到编译器内置的约束 comparable,该类型必须支持== 方法。

func GenericFunc[T comparable](args
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Golang 是不支持的,所以你不能使用。但是你可以使用类似于的方法来实现类似的效果。 你可以使用 interface{} 类来表示任何类。例如: ``` func Print(a interface{}) { fmt.Println(a) } ``` 这样就可以使用 Print 函数输出任何类的值了。 你也可以使用反射来实现类似的效果。例如: ``` func Print(a interface{}) { v := reflect.ValueOf(a) fmt.Println(v) } ``` 这样就可以使用 Print 函数输出任何类的值了。 你也可以使用模板函数来实现类似的效果。例如: ``` func Print(a interface{}) { t := template.Must(template.New("").Parse("{{.}}")) t.Execute(os.Stdout, a) } ``` 这样就可以使用 Print 函数输出任何类的值了。 希望这对你有帮助。 ### 回答2: 截至2021年1月,Go语言(Golang)尚不具备内建的机制,即没有直接的方法来创建通用的数据结构和算法。然而,Go社区一直在探索如何在缺少的情况下实现通用性。 在没有的情况下,开发者通常采用特定类的接口(interface{})或类断言(type assertion)来实现类似的效果。使用接口可以定义通用的函数签名,使函数能够接受多种类参数。同时,使用断言可以在运行时检查参数的实际类,并进行相应的处理。 此外,Go语言还提供了一些通用的数据结构和算法库,如container包的List、HashMap等。通过在这些数据结构和算法使用interface{}类,并利用类断言来确保类的正确性,可以实现相对通用的功能。 Go语言的开发团队也一直在推动的研究和开发。在2022年将发布的Go 1.18版本,预计将加入的支持。该特性将为开发者提供使用更为简洁和安全的方式来创建通用的数据结构和算法。 总之,目前在Go语言还没有内建的机制,但可以通过接口和类断言来实现类似的功能。此外,Go语言的开发者正在努力研发并计划在未来的版本添加支持。 ### 回答3: 目前(截至2021年),Go语言(Golang)尚不支持原生,这意味着在编写Go代码时,无法直接声明或方法。然而,Go社区一直在积极探索和讨论如何实现,有一些可选方案可以用来模拟使用。 其,最常见的一种方法是使用接口类实现。通过创建一个接口类并在函数签名或结构体使用该接口类作为参数或字段,可以实现对各种类的参数和字段的通用操作。这种方法虽然可以达到类似的效果,但在类实参和类断言方面存在一些限制和复杂性。 另一种方法是使用代码生成工具模拟。通过在编译时使用代码生成工具,可以根据不同的类参数生成特定的代码,并将其插入到源代码。这种方式可以实现在编译时生成针对不同类的特定代码,从而实现类似的效果。但是,这种方法需要使用额外的工具和开发流程,并且会增加代码的复杂性。 除了这些方法外,Go社区还在不断探索其他更为原生的实现方式,例如Go2的设计,该设计目前正在积极开发。Go2通过添加函数的直接支持,将大大简化使用的过程,并提供更好的类安全和可读性。尽管Go2还未正式发布,但对于在项目使用的需求,可以关注最新的Go官方进展和社区讨论。 总的来说,目前在Go语言,尚不支持原生的,但可以使用接口类或代码生成工具等方式来模拟使用。未来,随着Go2的正式发布,将会提供更为便捷和直接的方式来使用。环境和项目需求决定了选择合适的方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值