当前位置: 首页 > news >正文

网站建设qinnet/营业推广经典案例

网站建设qinnet,营业推广经典案例,宁波本地模板网站建设平台,微信开发者工具教程实例Go 和Python语言不同,处理不同数据类型非常严格。如Python可以定义函数带两个数值类型并返回较大的数值,但可以不严格指定参数类型为float或integer。同样功能go1.18之前版本需要定义两个函数分别处理对应类型,通过泛型可以实现上面描述功能&…

Go 和Python语言不同,处理不同数据类型非常严格。如Python可以定义函数带两个数值类型并返回较大的数值,但可以不严格指定参数类型为float或integer。同样功能go1.18之前版本需要定义两个函数分别处理对应类型,通过泛型可以实现上面描述功能,无需为每种类型重复定义函数。

本文通过示例学习Go泛型,包括三个部分:非泛型函数,泛型函数,泛型类型约束。

泛型的作用

我们知道Go一些函数(如fmt.Println)使用空interface支持多种数据类型,但需要开发者写大量代码实现很多函数或方法支持多种自定义类型不是最佳选项,于是泛型登场,提供新的解决方案,无需使用接口和反射支持多种数据类型。

下面通过示例来说明:

package main
import ("fmt"
)func Print[T any](s []T) {for _, v := range s {fmt.Print(v, " ")}fmt.Println()
}func main() {Ints := []int{1, 2, 3}Strings := []string{"One", "Two", "Three"}Print(Ints)Print(Strings)
}

上面代码种Print()函数使用泛型,通过在函数名称和参数之间增加[T any]指定泛型变量, 既然T 为any类型,函数可传入任何数据类型slice。当然Print函数不能处理slice之外的输入,这是因为函数实现决定的。通过泛型函数可以避免针对每种数据类型编写函数,这种通用的思想就是泛型。

非泛型函数

我们实现两个函数,返回数值类型数组元素的和。我们至少创建两个函数,一个针对float64类型,另一个为int64,因此工作量翻倍。

package mainimport "fmt"func main() {f := []float64{1.0, 2.0, 3.0, 4.0, 5.0}i := []int64{1, 2, 3, 4, 5}s1 := SumOfFloat(f)s2 := SumOfIntegers(i)fmt.Println("Sum for float64 :", s1)fmt.Println("Sum for int64 :", s2)}func SumOfFloat(nums []float64) float64 {var sum float64for _, num := range nums {sum += num}return sum
}func SumOfIntegers(nums []int64) int64 {var sum int64for _, num := range nums {sum += num}return sum
}

运行输出结果:

$ go run main.go
Sum for float64 : 15
Sum for int64 : 15

上面代码针对两种类型定义了两个函数,返回各自参数对应类型数组元素之和。下面通过泛型合并两个函数为一个,节约时间和精力。

泛型函数

本节实现单个函数,参数仍然是数组,但类型可以为float64或int64,并返回数组元素之和,从而可以代替上面两个函数。

为了能够定义函数接收float64和int64两种类型,新的泛型函数需要声明接收的类型,即调用代码需要判断类型是否为float64或int64。为此,新的函数签名需要有点变化,除了普通的参数外,还需要声明类型参数,从而转换函数为泛型函数支持不同类型。

每个形参都有一个类型约束,它指定调用代码可用于形参允许的实参类型。在编译时这些参数表示的类型就是调用代码支持的类型。当然泛型函数的实现逻辑需要支持形参声明的所有类型。举例,泛型函数支持字符串和数值参数,函数实现逻辑需要对参数进行索引,显然数值无法索引将引起编译错误。

泛型函数语法

func genericFunction[T any](s []T) []T{}

解释如下:

上面语法种在名称和参数之间的[]用于指定形式参数类型,可以是一组类型或一个约束接口。T 参数类型,用于定义形式参数和返回值类型。

函数内部也可以访问参数,any 是一个interfaceT必须实现该接口。Go1.18版本引入any,底层引用空接口,即interface{}。 下面举例说明:

package mainimport "fmt"func main() {f := []float64{1.0, 2.0, 3.0, 4.0, 5.0}i := []int64{1, 2, 3, 4, 5}s1 := genericSum(f)s2 := genericSum(i)fmt.Println("Sum for float64 :", s1)fmt.Println("Sum for int64 :", s2)}func genericSum[N int64 | float64](nums []N) N {var sum Nfor _, num := range nums {sum += num}return sum
}

输出结果:

$ go run main.go
Sum for float64 : 15
Sum for int64 : 15

上面示例中演示定义泛型函数genericSum。参数类型在[]中声明的泛型类型。N声明在形参和返回值中使用,N是新的类型,被限定了两种类型float64 和 int64的联合类型。

在函数体类,首先声明N类型变量,然后遍历数组计算综合并返回。

假设泛型函数支持很多种类型,比如:int, int8 , int26, int32, int64, float32, float64。这样函数签名变得非常冗长难看,我们可以定义一个类型包括上述类型,本质上就是把联合类型迁移至函数声明外面。

package mainimport "fmt"type Number interface {int64 | float64
}func main() {f := []float64{1.0, 2.0, 3.0, 4.0, 5.0}i := []int64{1, 2, 3, 4, 5}s1 := genericSum(f)s2 := genericSum(i)fmt.Println("Sum for float64 :", s1)fmt.Println("Sum for int64 :", s2)}func genericSum[N Number](nums []N) N {var sum Nfor _, num := range nums {sum += num}return sum
}

总结

本文是关于Go泛型的,因为泛型是Golang的新成员。通过对比带泛型和不带泛型的函数,泛型可以很明显地节省时间和精力。泛型不是接口的替代品,两者被设计为一起工作,避免重复代码,让Go类型更安全、代码更整洁。

http://www.lbrq.cn/news/943957.html

相关文章:

  • 新城建站/东莞seo建站排名
  • 泰安手机网站建设/google play谷歌商店
  • 阿里巴巴国际站官网首页/外贸网站搭建推广
  • 叶县建设局网站/站长统计app
  • php是专门做网站的/seo营销课程培训
  • 深圳做外贸网站公司哪家好/指数基金排名前十名
  • wordpress二级菜单调用/郑州seo外包顾问热狗
  • 做图兼职网站有哪些/短视频营销
  • 表白网站在线制作软件/海外网站推广的公司
  • 贵州省教育厅办公室关于开展2014年学校门户网站建设评估的通知/免费网站建设seo
  • 知知网站推荐/青岛网站建设制作
  • 为什么进不了中国建设银行网站/推广任务接单平台
  • 建设企业网站官网u盾登录/网站制作
  • 靖安建设局网站/网络建设推广
  • 常州网站建设 最易/百度推广开户代理
  • 淘宝客服推销做网站的技巧/深圳知名网络优化公司
  • vs做网站头部的代码/网店推广营销方案
  • 武汉市做网站/怎么免费建公司网站
  • 云服务器怎么样做网站/百度搜索风云榜人物
  • 企业网站开发费用会计分录/百度明星人气榜排名
  • 抖音seo公司帝搜平台/专业网站优化排名
  • 安阳网站建设哪家专业/百度一下就知道了官网楯
  • 做网站建设销售途径/网络培训心得体会
  • 新素材网站/关键词规划师工具
  • 公安科技信息化建设 素材 网站/免费做网站推广的软件
  • 英文外贸网站/天天seo站长工具
  • c#网站开发案例大全/思亿欧seo靠谱吗
  • 口碑好的武汉网站建设/公司网站建设需要注意什么
  • WordPress去掉你的位置/百度爱采购优化排名软件
  • 制作手机app需要学什么/seo网站页面优化包含
  • Chessboard and Queens
  • Pspice仿真电路:(三十四)如何使用Pspcie进行仿真
  • 网安-中间件-Redis未授权访问漏洞
  • 设计模式十一:享元模式(Flyweight Pattern)
  • Qwen3-235B-A22B-Thinking-2507 - 开源思维推理模型的新标杆
  • Elasticsearch(ES)安装