zoukankan      html  css  js  c++  java
  • go使用接口类型实现“模板类”

    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

  • 相关阅读:
    nodejs ---day01
    面向对象
    面向对象
    面向对象
    webpack
    webpack
    webpack
    模块化 (ESM) --- day02
    模块化 --- day01
    轮播图(淡入淡出切换)
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/15705443.html
Copyright © 2011-2022 走看看