一,自定义栈
package stack import "errors" type Stack []interface{} func (stack *Stack) Pop(interface{}, error) { theStack := *stack if len(theStack) == 0 { return nil, errors.New("can't pop() an empty stack") } x := theStack[len(theStack)-1] *stack = theStack[:len(theStack)-1] return x, nil } func (stack *Stack) Push(x interface{}) { *stack = append(*stack, x) } func (stack *Stack) Top() (interface{}, error) { if len(stack) == 0 { return nil, errors.New("cat't top() an empty stack") } return stack[len(stack)-1], nil } func (stack Stack) Cap() int { return cap(stack) } func (stack Stack) Len() int { return len(stack) } func (stack Stack) IsEmpty() bool { return len(stack) == 0 }
作为一个包,首先是声明,如果是main包,那么就是要声明一个main函数,并能独立运行的。
然后包里面定义了stack说interface类型,并定义了很多stack的具体方法。
关于interface,interface是一群方法的合称,在一个interface里,可以包含一系列的具体方法。
golang中所有的类型都实现了空interface,所以可以把这些interface存储在stack中。
二,接口
在Go语言中,接口是一个自定义类型,它声明了一个或者多个方法签名,接口是完全抽象的,因此不能将其实例化。然而,可以创建一个其类型事接口的变量,它可以赋值为任何满足该接口类型的实际类型的值。
定义interface时候,接口名惯例用er结尾。
通过定义和使用interface,可以在不改变继承树的情况下就灵活的增加类型,方法,接口。
有疑问加站长微信联系(非本文作者)