新手对interface的疑惑

某DN上看到个帖子
blog.csdn.net/weixin_34185512/arti...

换句话说,接口类型本身就是一个指针。

那我定义一个func,怎么能实现必须传某个接口的指针呢?
如:

type i1 interface {
    print()
}
type v1 struct{}
func (v *v1) print() {
    fmt.Println(v)
}

// 疑问
func showV(v *i1) {}  //  <- 怎么能够限制必须传指针 showV **必须** 要实现对v的修改必须要影响外部

showV 现在必须传指针是可以实现的,因为有v1的func (v *v1)的限制。
但是如果像是团队开发,A定义的一个interface,B定义的一个func,这个func必须要能修改。然后C再用个struct实现接口还不传指针如func (v v1)就完事了。那这个约束是不是就不能实现了。

最佳答案

自问自答

type i1 interface {
    print()
}
type v1 struct{}
func (v v1) print() {
    fmt.Println(v)
}

var v i1 = v1{}
showV(&v)

func showV(v *i1) {}
2年前 评论
讨论数量: 5

要限制传递的具体类型,就不能用接口限制,得用具体的结构体做限制。

接口只是为了让你知道需要实现哪些方法

2年前 评论

案例:

package main

type A struct {}

type IA interface {
    Eat() string
}

var _ IA = (*A)(nil)

func main() {
}

如想实现检测结构体是否实现某个接口,可以使用var _ ArgName这种定义变量的形式。

以上案例中,var _ IA = (*A)(nil)会在编译时检测A是否实现了IA接口,如果没有实现该接口,则会在编译时报错

cannot use (*A)(nil) (type *A) as type IA in assignment:
    *A does not implement IA (missing Eat method)
2年前 评论
func showV(v i1) {}
2年前 评论
cevin (楼主) 2年前

自问自答

type i1 interface {
    print()
}
type v1 struct{}
func (v v1) print() {
    fmt.Println(v)
}

var v i1 = v1{}
showV(&v)

func showV(v *i1) {}
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!