Go泛型学习笔记

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

文章目录

1、泛型函数

交换两个值

go 复制代码
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、泛型类型

go 复制代码
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、接口约束

go 复制代码
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、处理不同类型的值

go 复制代码
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、处理泛型切片

go 复制代码
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)
}
相关推荐
La Pulga12 小时前
【FreeRTOS源码学习笔记】任务延时列表
笔记·mcu·学习·嵌入式·freertos·实时操作系统
楚山之石14 小时前
【JCO】mpMRI 先行替代 TURBT 初始分期:BladderPath 随机试验让 MIBC 患者提前 45 天得到正确治疗
人工智能·学习·mri·医学影像
Peter-OK17 小时前
PostgreSQL学习笔记(入门-进阶-精通说明)
笔记·学习·postgresql
承渊政道17 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
橙橙笔记19 小时前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能
成都蜀味缘餐饮技术培训学校19 小时前
手撕烤兔技术培训实战指南,秘制腌料配方比例与调制手法
大数据·经验分享·笔记·其他·微信公众平台
希和202720 小时前
免费AI视频生成工具汇总(国内优先,适合做漫剧、短视频,Obsidian笔记版)
人工智能·笔记·音视频
JWASX20 小时前
【Go】map 源码解析 - group
后端·golang·map·源码分析
蒸蒸yyyyzwd21 小时前
秋招学习笔记 day109
笔记·八股
Hhy_11071 天前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio