GO基础进阶篇 (十三)、泛型

这篇具有很好参考价值的文章主要介绍了GO基础进阶篇 (十三)、泛型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

泛型

先看一下这段代码。

package main

import "fmt"

func main() {
	strs := []string{"a", "b"}
	printArray(strs)
}

func printArray(arr []interface{}) {
	for _, a := range arr {
		fmt.Println(a)
	}
}

上面的代码中,我们想要打印参数arr的信息。运行报错

 cannot use strs (variable of type []string) as []interface{} value in argument to printArray

想要解决的话,按照之前我们的学习,可以将函数改编如下(使用断言)

package main

import "fmt"

func main() {
	strs := []string{"a", "b"}
	printStringArray(strs)
}

func printStringArray(arr interface{}) {
	for _, a := range arr.([]string) {
		fmt.Println(a)
	}
}

但这样会有一个坏处,当我们想要打印另一个非string的数组时,就不得不再写一个方法

package main

import "fmt"

func main() {
	ints := []int{1, 2}
	printIntArray(ints)
}

func printIntArray(arr interface{}) {
	for _, a := range arr.([]int) {
		fmt.Println(a)
	}
}

这样处理,就会导致有无限多相似的代码产生,这样的代码时不合格的。

此时,泛型就出现了。它的意义时不在方法定义时决定变量的类型,而让使用者使用时决定。

package main

import "fmt"

func main() {
	ints := []int{1, 2}
	strs := []string{"a", "b"}
	printArray(ints)
	printArray(strs)
}

func printArray[T string | int](arr []T) {
	for _, a := range arr {
		fmt.Println(a)
	}
}

T代表了用户传入的类型,并对T进行了约束。上面的代码中,我们再定一个float的数组,是无法通过程序校验的,因为我们约束了T的可用类型为stirng与int。

使用泛型,你可能会产生一个疑惑,通过我们刚刚学习的反射,再加上接口。也可以类似泛型这样的函数。这样是可行的,但反射的机制存在一些问题

  • 1.用起来麻烦
  • 2.失去了编译时的类型检查,容易出错
  • 3.性能不理想

结论:当需要因为不同类型写完全相同的逻辑代码时,使用泛型时最合适的选择。

泛型类型

  • 泛型切片
package main

import "fmt"

func main() {
	type Slice[T int | string | float32] []T
	var a Slice[int] = []int{1, 2, 3}
	var b Slice[string] = []string{"a", "b", "c"}
	var c Slice[float32] = []float32{1, 2, 3}

	fmt.Printf("%T", a)
	fmt.Println(a)
	fmt.Printf("%T", b)
	fmt.Println(b)
	fmt.Printf("%T", c)
	fmt.Println(c)
}

//main.Slice[int][1 2 3]
//main.Slice[string][a b c]
//main.Slice[float32][1 2 3]

  • 泛型map
package main

import "fmt"

func main() {
	type MyMap[KEY int | string, VALUE float32] map[KEY]VALUE

	var m1 MyMap[string, float32] = map[string]float32{
		"a": 1.1,
		"b": 1.2,
	}

	fmt.Println(m1)
}

  • 其他
	//泛型结构体
	type MyStruct[T int | string] struct {
		id   T
		Name stirng
	}
	//泛型接口
	type IPrintData[T int | float32 | string] interface {
	}
	//泛型通道
	type MyChan[T string | int] chan T

泛型函数与方法

package main

import "fmt"

func main() {
	//给泛型添加方法
	var s MySlice[int] = []int{1, 2, 3, 4}
	fmt.Println(s.Sum())

	var s1 MySlice[float64] = []float64{1.1, 2.1, 3.1, 4.1}
	fmt.Println(s1.Sum())

	//泛型函数
	fmt.Println(Add[int](1, 2))
	fmt.Println(Add[string]("1", "2"))

	//如果类型能被自动推断,函数调用时的T可以省略
	fmt.Println(Add(1, 2))
	fmt.Println(Add("1", "2"))
}

type MySlice[T int | string | float64] []T
func (s MySlice[T]) Sum() T {
	var sum T
	for _, v := range s {
		sum += v
	}
	return sum
}

func Add[T int | float32 | string](a T, b T) T {
	return a + b
}

实际开发中,泛型使用较多的场景就是泛型的函数与方法。文章来源地址https://www.toymoban.com/news/detail-801224.html

自定义泛型约束

package main

import "fmt"

func main() {
	fmt.Println(GetMaxNum(1, 2))
	fmt.Println(GetMaxNum(1.5, 2.6))
}

type MyInt interface {
	int | int8 | int16 | int32 | float64
}

func GetMaxNum[T MyInt](a, b T) T {
	if a > b {
		return a
	}
	return b
}

到了这里,关于GO基础进阶篇 (十三)、泛型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

    在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 数组和切片是两个常用的数据结构。它们都可以用于存储一组相同类型的元素,但在底层实现和使用方式上存在一些重要的区别。 Go 中数组的长度是不可改变的

    2024年02月15日
    浏览(46)
  • 【Golang】Golang进阶系列教程--为什么 Go 语言 struct 要使用 tags

    在 Go 语言中,struct 是一种常见的数据类型,它可以用来表示复杂的数据结构。在 struct 中,我们可以定义多个字段,每个字段可以有不同的类型和名称。 除了这些基本信息之外,Go 还提供了 struct tags,它可以用来指定 struct 中每个字段的元信息。 在本文中,我们将探讨为什

    2024年02月15日
    浏览(60)
  • 【Golang】Golang进阶系列教程--为什么说 Go 语言字符串是不可变的?

    最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢? 这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就来回答一下。 首先来看看它的底层结构: 和切片的结构很像,只不过少了一个

    2024年02月14日
    浏览(43)
  • 【Golang】go编程语言适合哪些项目开发?

    前言 在当今数字化时代,软件开发已成为各行各业的核心需求之一。 而选择适合的编程语言对于项目的成功开发至关重要。 本文将重点探讨Go编程语言适合哪些项目开发,以帮助读者在选择合适的编程语言时做出明智的决策。 Go 编程语言适合哪些项目开发? Go是由Google开发

    2024年02月04日
    浏览(60)
  • 【Go之道】探索Go语言之旅:基础与进阶指南

    在这个数字化快速发展的时代,掌握一门编程语言已成为必备技能。今天,我将带你踏上【Go之道】,探索Go语言的魅力,为你的编程之旅助力。 Go,又称为Golang,是由Google设计和开发的一种静态类型、编译型和并发型的编程语言。 凭借其简洁、高效和并发性能优越等特点,

    2024年02月08日
    浏览(32)
  • 【Golang】VsCode下开发Go语言的环境配置(超详细图文详解)

    📓推荐网站(不断完善中):个人博客 📌个人主页:个人主页 👉相关专栏:CSDN专栏、个人专栏 🏝立志赚钱,干活想躺,瞎分享的摸鱼工程师一枚 ​ 话说在前,Go语言的编码方式是 UTF-8 ,理论上你直接使用文本进行编辑也是可以的,当然为了提升我们的开发效率我们还是需

    2024年02月07日
    浏览(70)
  • 100天精通Golang(基础入门篇)——第23天:错误处理的艺术: Go语言实战指南

    🌷🍁 博主猫头虎🐅🐾 带您进入 Golang 语言的新世界✨✨🍁 🦄 博客首页 ——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》 🐾 学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通

    2024年02月07日
    浏览(54)
  • 100天精通Golang(基础入门篇)——第5天: Go语言中的数据类型学习

    🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批

    2024年02月08日
    浏览(36)
  • Prompt工程师指南[从基础到进阶篇]:用于开发和优化提示,以有效地使用语言模型(LMs)进行各种应用和研究主题

    Prompt工程是一种相对较新的学科,用于开发和优化提示,以有效地使用语言模型(LMs)进行各种应用和研究主题。Prompt工程技能有助于更好地理解大型语言模型(LLMs)的能力和局限性。研究人员使用Prompt工程来改善LLMs在各种常见和复杂任务上的能力, Prompt engineering(提示工程

    2024年02月04日
    浏览(41)
  • 二蛋赠书四期:《Go编程进阶实战:开发命令行应用、HTTP应用和gRPC应用》

    大家好!我是二蛋,一个热爱技术、乐于分享的工程师。在过去的几年里,我一直通过各种渠道与大家分享技术知识和经验。我深知,每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此,我非常感激大家一直以来对我的关注和支持。 为了回馈大家的厚爱,

    2024年02月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包