判断一个变量是否实现了指定接口:
定义一个接口变量,然后将类型赋值给接口变量,再用 ok去判断是否实现了指定接口。有点像 interface里面装了int一样,虽然type输出是int,但是是用 空的interface{} 装的。
func main() {
//定义一个变量,由于file实现了rw方法,使用,可以调用接口的方法。
var f File
Test(&f)
var t interface{}
t = f //空的接口来接收
if v, ok := t.(ReadWriter); ok {
fmt.Println(ok, v)
}
}
go实现一个通用的链表类接口
F:.
└─main
link.go
main.go
link.go
package main
import "fmt"
type LinkNode struct {
data interface{}
next *LinkNode
}
type Link struct {
head *LinkNode
tail *LinkNode
}
//头部插入
func (p *Link) InsertHead(data interface{}) {
node := &LinkNode{
data: data,
next: nil,
}
if p.tail == nil && p.head == nil {
p.tail = node
p.head = node
return
}
node.next = p.head
p.head = node
}
//尾部插入
func (p *Link) InsertTail(data interface{}) {
node := &LinkNode{
data: data,
next: nil,
}
if p.tail == nil && p.head == nil {
p.tail = node
p.head = node
return
}
p.tail.next = node
p.tail = node
}
func (p *Link) Trans() {
q := p.head
for q != nil {
fmt.Println(q.data)
q = q.next
}
}
main.go(也就是写一个测试的)
package main
import "fmt"
func main() {
fmt.Println("=============HEAD====int==============")
var intLinkhead Link
for i := 0; i < 10; i++ {
intLinkhead.InsertHead(i)
}
intLinkhead.Trans()
fmt.Println("=============TAIL===string===============")
var intLinktail Link
for i := 0; i < 10; i++ {
intLinktail.InsertTail(fmt.Sprintf("str %d", i))
}
intLinktail.Trans()
}