ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-12-18 17:03:09  阅读:158  来源: 互联网

标签:int fmt 接口类型 mystack go Mystack stack 模板


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()
 mt.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{},我们就实现了将普通类转化为模板类,还是很简单的吧,哈哈~
————————————————
版权声明:本文为CSDN博主「djqueue」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013536232/article/details/104870718

标签:int,fmt,接口类型,mystack,go,Mystack,stack,模板
来源: https://www.cnblogs.com/cheyunhua/p/15705443.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有