新手对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) {}
3年前 评论
讨论数量: 5

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

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

3年前 评论

案例:

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)
3年前 评论
func showV(v i1) {}
3年前 评论
cevin (楼主) 3年前

自问自答

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

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

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