登录
首页 >  Golang >  Go问答

在 Go 语言中利用接口实现通用性?

来源:stackoverflow

时间:2024-02-25 13:51:22 289浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《在 Go 语言中利用接口实现通用性?》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

我正在尝试在 go 中编写一个适用于 int 和 rune 数组类型的堆栈。但这似乎不起作用。我认为这应该可以工作,因为我有一个接口类型来保存任何类型。堆栈的操作对于所有类型都是通用的。我不想使用go自带的stack接口

package main

import "math"

type expressionStack interface {
    pop() interface
    getSize() int
    push(item interface)
    peek() interface

}

type intStack []int
type runeStack []rune

func createStack(st interface) {
    return &expressionStack{}
}

func (stack *expressionStack) getSize() int {
    return len(stack)
}

func (stack *expressionStack) pop() int {
    length := len(stack)
    if length == 0 {
        panic("Stack is underflown")
    }
    item := stack[length-1]
    stack = stack[:length-1]
    return item
}

func (stack *expressionStack) push(item interface) {
    stack = append(stack, item)
}

func (stack *expressionStack) peek() int {
    leng := len(stack)
    if leng == 0 {
        return -math.MaxInt32
    }
    item := stack[leng-1]
    return item
}

正确答案


这些问题的解决方案是使用代码生成。

它需要对 api 进行一些安排,因为生成器非常愚蠢,但它可以完成工作。

我首先在 gopath(老派)下声明一个包:test/d/gen

我创建了一个新文件 template.go,并安排了一些代码

package gen

type t int

type expressionstack []t

func (stack *expressionstack) getsize() int {
    return len(*stack)
}

func (stack *expressionstack) pop() t {
    length := len(*stack)
    if length == 0 {
        panic("stack is underflown")
    }
    item := (*stack)[length-1]
    *stack = (*stack)[:length-1]
    return item
}

func (stack *expressionstack) push(item t) {
    *stack = append(*stack, item)
}

func (stack *expressionstack) peek() (zero t, ok bool) {
    leng := len(*stack)

    if leng == 0 {
        return
    }

    item := (*stack)[leng-1]
    return item, true
}

我尝试将 https://github.com/mmatczuk/go_genericsgo_generics -t=t=int32 -t=expressionstack=intstack -i=./template.go -o out.go -p gen 之类的东西一起使用,但失败了。

尝试了另一个 https://github.com/clementauger/jenjenjenjen -template=test/d/gen "expressionstack:t => int32, t => -, expressionstack=>int32stack" -

我得到了一个简洁的输出

package gen

type Int32Stack []int32

func (stack *Int32Stack) getSize() int {
    return len(*stack)
}

func (stack *Int32Stack) pop() int32 {
    length := len(*stack)
    if length == 0 {
        panic("Stack is underflown")
    }
    item := (*stack)[length-1]
    *stack = (*stack)[:length-1]
    return item
}

func (stack *Int32Stack) push(item int32) {
    *stack = append(*stack, item)
}

func (stack *Int32Stack) peek() (zero int32, ok bool) {
    leng := len(*stack)

    if leng == 0 {
        return
    }

    item := (*stack)[leng-1]
    return item, true
}

困难的事情是弄清楚 "expressionstack:t => int32, t => -, expressionstack=>int32stack",它是一个三语句指令,

  • t => -,在包内,去掉t
  • expressionstack=>int32stack,在包内将expressionstack重命名为int32stack

不过,我在使用最后一个包将输出保存到所需文件时遇到了一些问题。并不完美。

还有很多其他包可以做到这一点,

终于介绍完啦!小伙伴们,这篇关于《在 Go 语言中利用接口实现通用性?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>