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

Go泛型学习笔记

Go泛型内容不多可类比C++这种编程语言,共编写了泛型函数,泛型类型、接口约束、处理不同类型的值、处理泛型切片的常见demo举例

文章目录

  • 1、泛型函数
  • 2、泛型类型
  • 3、接口约束
  • 4、处理不同类型的值
  • 5、处理泛型切片

1、泛型函数

交换两个值

func Swap[T int | int32 | int64](a, b T) (T, T) {
	return b, a
}

func main() {
	a, b := 1, 2
	a, b = Swap(a, b)
	fmt.Println(a, b)

	x, y := "hello", "world"
	x, y = Swap(x, y) //编译不通过,因为泛型没有加入
	fmt.Println(x, y)
}

2、泛型类型

package main

import "fmt"

//int | int32 | int64 | float32 | float64

type Stack[T int | int32] struct {
	elements []T
}

func (s *Stack[T]) Push(element T) {
	s.elements = append(s.elements, element)
}

func (s *Stack[T]) Pop() (T, bool) {
	if len(s.elements) == 0 {
		var zero T
		return zero, false
	}
	element := s.elements[len(s.elements)-1]
	s.elements = s.elements[:len(s.elements)-1]
	return element, true

}

func main() {
	intStack := &Stack[int]{}
	intStack.Push(123)
	intStack.Push(456)
	fmt.Println(intStack.Pop())
	fmt.Println(intStack.Pop())

}

3、接口约束

package main

import "fmt"

type Comparable[T comparable] interface {
	Compare(a, b T) int
}

type IntComparator struct{}

func (ic IntComparator) Compare(a, b int) int {
	if a < b {
		return -1
	} else if a > b {
		return 1
	}
	return 0
}

func main() {
	ic := IntComparator{}
	fmt.Println(ic.Compare(1, 2))
	fmt.Println(ic.Compare(3, 4))
	fmt.Println(ic.Compare(8, 6))

}

4、处理不同类型的值

package main

import "fmt"

func Add[T, U int | string | float32 | float64](a T, b U) string {
	return fmt.Sprintf("%v+%v", a, b)
}

func main() {
	fmt.Println(Add(10, 20))
	fmt.Println(Add("Hello", 5))
	fmt.Println(Add(3.13, 3.74))
}

5、处理泛型切片

package main

import "fmt"

func PrintSlice[T int | int32 | int64 | string](slice []T) {
	for _, v := range slice {
		fmt.Println(v)
	}

}

func main() {
	intSlice := []int{1, 2, 3, 4}
	stringSlice := []string{"Go", "Lang", "Generics"}
	PrintSlice(intSlice)
	PrintSlice(stringSlice)
}


http://www.kler.cn/a/579626.html

相关文章:

  • C++二叉搜索树代码
  • 旋转验证码截图识别
  • ⭐LeetCode(数学分类) 48. 旋转图像——优美的数学法转圈(原地修改)⭐
  • Easysearch 使用 AWS S3 进行快照备份与还原:完整指南及常见错误排查
  • 蓝桥杯[每日两题] 真题:好数 神奇闹钟 (java版)
  • 【微知】如何根据内核模块ko查看所依赖其他哪些模块?(modinfo rdma_ucm |grep depends)
  • 【Java学习】包装类
  • 基于策略模式的智能提示语生成器设计与实现——以Tkinter GUI开发为例
  • 一文了解汽车图像传感器
  • 1-002:MySQL InnoDB引擎中的聚簇索引和非聚簇索引有什么区别?
  • 逐梦DBA:Linux下MySQL字符集的处理
  • OkHttp 之任务调度模块源码分析
  • 为php添加额外的功能模块
  • 论文阅读笔记——OpenVLA: An Open-Source Vision-Language-Action Model
  • YC 孵化项目 Pinch:实时语音翻译视频会议平台;Mistral OCR:能处理多语言多模态复杂文档丨日报
  • 数据量过大的时候导出数据很慢
  • 链式多分支规则树模型结构
  • robotjs获取鼠标位置
  • c++介绍锁四
  • 快速排序(二叉树的前序递归遍历思想)