go使用接口类型实现“模板类”

本文介绍如何使用Go语言的接口特性来实现类似C++中模板类的功能,支持多种数据类型,如int、char、string等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++支持多态,可以通过重载和模板实现多态,其中模板类这个功能我感觉很方便,比如想写一个栈类型,可以通过模板类,只定义一个类,就能让这个栈支持int,double,char等多种数据类型。

go语言呢,不支持多态,自然也就没有模板这个概念,但是没有关系,go语言的设计者自然知道多态的好处,只是觉得重载这个概念不好理解,所以把多态这个东西给去掉了,取而代之的是一种更简单的编程方式-接口

下面我们就来看看,如何使用接口实现C++的模板类。

使用接口实现模板类

首先,我们实现一个int类型的stack。

package mystack

import "errors"

type Mystack []int

func (stack *Mystack) Pop() (int, error) {
	if len(*stack) == 0 {
		return 0, errors.New("Pop error, stack is empty!")
	}
	tail := (*stack)[len(*stack)-1]
	*stack = (*stack)[:len(*stack)-1]
	return tail, nil
}

func (stack *Mystack) Push(val int) {
	*stack = append(*stack, val)
}

我们这里定义了一个Mystack类型,其实就是一个int型切片,放在在mystack包里,并且定义了两个方法Push和Pop。接下来我们先看一下效果。

package main

import (
	"fmt"
	mystack "test/stack"
)

func main()  {
	stack := mystack.Mystack{1}
	fmt.Println(stack)
	stack.Push(2)
	fmt.Println(stack)
	stack.Pop()
	fmt.Println(stack)
}

运行结果如下:

欧克,现在我们想让这个栈支持其他的类型,怎么办呢,很简单,把切片类型由int改为接口就可以了,刚才的程序只要改3个地方:

既然改成了“模板类”,那测试函数自然也得搞复杂一些,多整几种类型。

package main

import (
	"fmt"
	mystack "test/stack"
)

func main()  {
	stackInt := mystack.Mystack{1}
	stackByte := mystack.Mystack{'a'}
	stackString := mystack.Mystack{"abc"}
	fmt.Println("origin:", stackInt, stackByte, stackString)
	stackInt.Push(2)
	stackByte.Push('b')
	stackString.Push("efg")
	fmt.Println("after push:", stackInt, stackByte, stackString)
	stackInt.Pop()
	stackByte.Pop()
	stackString.Pop()
	fmt.Println("after push:", stackInt, stackByte, stackString)
}

运行结果如下:

这结果,对的不能再对了,也就是说,现在我们写的这个Mystack,已经可以支持int,char,string等所有类型了。

通过把参数类型设置成interface{},我们就实现了将普通类转化为模板类,还是很简单的吧,哈哈~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值