likes
comments
collection
share

面试问:Golang 中的接口和Java中的有什么区别?

作者站长头像
站长
· 阅读数 40

在Golang中,接口的设计确实与Java有所不同。Golang采用的是隐式接口实现机制,这意味着你不需要显式地声明某个类型实现了某个接口,而只要该类型实现了接口要求的方法集,它就隐式地实现了该接口。

已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享

这种设计虽然简洁,但也带来了问题。

让我们详细分析一下你给出的代码片段:


type Dog interface {
    getName() string
}

type Human interface {
    getName() string
}

type Corgi struct {
    name string
}

func (corgi *Corgi) getName() string {
    return corgi.name
}

type Asian struct {
    name string
}

func (asian *Asian) getName() string {
    return asian.name
}

在这段代码中,我们定义了两个接口 Dog 和 Human,它们的签名相同,都包含一个 getName() 方法。同时,我们定义了两个结构体 Corgi 和 Asian,它们都实现了 getName() 方法。那么,Asian 到底实现了 Dog 还是 Human 接口呢?

实际上,在Golang中,Asian 结构体同时实现了 Dog 和 Human 接口。由于 Dog 和 Human 的方法签名完全一致,Golang 会将 Asian 视为实现了这两个接口。

这种设计在某些情况下可能会引发歧义和潜在的问题。

为了应对这种情况,可以采取以下几种解决方案:

1. 接口命名与职责分离

一个好的设计原则是确保接口的命名能够清晰地表达其职责。不同的接口应该有不同的命名空间,即使它们的方法签名相同。比如,你可以将接口 Dog 重命名为 DogBehavior,将接口 Human 重命名为 HumanIdentity,以避免混淆。

2. 类型断言与类型开关

在实际使用中,如果你需要明确区分 Asian 是作为 Dog 还是 Human 使用,可以使用类型断言和类型开关。例如:

func identify(i interface{}) {
    switch v := i.(type) {
    case Dog:
        fmt.Println("This is a Dog:", v.getName())
    case Human:
        fmt.Println("This is a Human:", v.getName())
    default:
        fmt.Println("Unknown type")
    }
}

通过这种方式,你可以在运行时根据实际类型进行区分。

3. 独立实现具体方法

如果在某些情况下你需要明确区分接口的实现,可以在不同的结构体中实现不同的方法。即使方法的逻辑相同,也可以通过不同的方法名来实现。例如:

type Dog interface {
    getDogName() string
}

type Human interface {
    getHumanName() string
}

type Corgi struct {
    name string
}

func (corgi *Corgi) getDogName() string {
    return corgi.name
}

type Asian struct {
    name string
}

func (asian *Asian) getHumanName() string {
    return asian.name
}

通过这种方式,Corgi 和 Asian 分别实现了不同的方法,避免了混淆。

总结一下

Golang的隐式接口设计带来了简洁的同时,也需要开发者在设计接口和实现时更加谨慎。通过合理的接口命名、使用类型断言与类型开关、以及在必要时分离具体方法的实现,可以有效避免你所提到的问题。

Golang和Java在接口设计上的差异反映了两者不同的语言哲学。Golang追求的是简洁和直接,而Java则强调明确和严格的类型约束。理解并适应这种差异,是掌握Golang接口设计的关键。希望这些建议能够帮助你更好地理解和运用Golang中的接口机制。

已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享

转载自:https://juejin.cn/post/7392256157203857459
评论
请登录