GoLang之泛型

GoLang之泛型

注:本文已Go SDK v1.18进行讲解

1.实现非泛型函数

下面以 map 为例,先看非泛型如何处理,泛型又是如何处理。
假如有两个 map,分别是 map[string]int 和 map[string]float64,编写函数将 map 中的 value 值相加,返回结果。因为有两个类型,因此编写两个函数;
在 main 函数中初始化两个 map 并调用上面的函数

package main

import "fmt"

// SumInts adds together the values of m.
func SumInts(m map[string]int64) int64 {
	var s int64
	for _, v := range m {
		s += v
	}
	return s
}

// SumFloats adds together the values of m.
func SumFloats(m map[string]float64) float64 {
	var s float64
	for _, v := range m {
		s += v
	}
	return s
}
func main() {
	// Initialize a map for the integer values
	ints := map[string]int64{
		"first":  34,
		"second": 12,
	}

	// Initialize a map for the float values
	floats := map[string]float64{
		"first":  35.98,
		"second": 26.99,
	}

	fmt.Printf("Non-Generic Sums: %v and %v\n",
		SumInts(ints),
		SumFloats(floats))
}
//Non-Generic Sums: 46 and 62.97

虽然得到了想要的结果,但 SumInts 和 SumFloats 的逻辑差不多。如果将来有其他类型,我们必须增加额外的函数,代码逻辑也类似。
有了泛型,只需要一个函数就可以实现以上两个函数的功能,而且可以方便扩展为支持其他相关类型,比如 map[iint]float64 等

2.实现泛型函数

[K comparable, V Number]是类型参数;
(m map[K]V)是普通函数参数
map[K]V 是一个 map,它的 key 类型是 K,value 类型是 V

我们把原本来函数声明里的 int64和float64的并集改造成了一个新的“类型限制接口”Number,声明了int64和float64的并集,当我们需要限制类型参数为int64或float64时,就可以使用Number这个类型限制来代替int64 | float64的写法。
int | float64 表示只允许是 int 或 float64,其他类型编译会报错,这是“类型约束”

我们定义了一个新的泛型函数,函数逻辑和之前定义过的泛型函数SumIntsOrFloats完全一样,只不过对于类型参数V,我们使用了Number来作为类型限制。和之前一样,我们把类型参数用于函数形参和函数返回类型

比如SumNumbers(ints),这个泛型函数调用里,我们忽略了类型实参(方括号[]里面的类型名称),Go编译器根据函数实参进行自动类型推导。

type Number interface {
	int64 | float64
}

func SumNumbers[K comparable, V Number](m map[K]V) V {
	var s V
	for _, v := range m {
		s += v
	}
	return s
}
func main() {
	// Initialize a map for the integer values
	ints := map[string]int64{
		"first":  34,
		"second": 12,
	}

	// Initialize a map for the float values
	floats := map[string]float64{
		"first":  35.98,
		"second": 26.99,
	}

	fmt.Printf("Generic Sums with Constraint: %v and %v\n",
		SumNumbers(ints),
		SumNumbers(floats))
	//输出:Generic Sums with Constraint: 46 and 62.97
}

3.comparable接口类型

comparable表示所有可比较类型,也就是说,K 可以是任意可比较类型

type comparable interface{ comparable }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Golang自V1.18版本开始正式支持Golang中可用于变量、函数、方法、接口、通道等多个语法实体。的使用方法可以分为以下几个方面: 1. 变量类变量类是针对类变量的,可以用于声明包含不同类的变量。例如,可以声明一个切片变量,使其可以存储不同类的元素。 2. 自定义:在Golang中,可以通过声明自定义的来扩展的使用。这意味着可以定义适用于不同类的自定义数据结构。 3. 调用带的函数:通过使用作为函数参数或返回值,可以调用带有的函数。这样可以实现在不同类上通用的函数逻辑。 4. 与结构体:可以与结构体一同使用,结构体中的字段和方法可以是,从而实现更灵活和通用的数据结构和操作。 然而,需要注意的是,Golang还存在一些限制和缺陷。例如,无法直接与switch语句配合使用。这是因为在中无法判断具体的类,而switch语句需要根据具体类进行分支判断。 总的来说,Golang提供了一种通用的类机制,使得代码更具灵活性和可复用性。但是需要熟悉的语法和使用限制,以避免在实际使用中遇到问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [全面解读!Golang的使用](https://blog.csdn.net/QcloudCommunity/article/details/125401490)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [go使用方法](https://blog.csdn.net/qq_42062052/article/details/123840525)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoGo在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值