Golang Go语言中接口的作用体现在哪里?

发布于 1周前 作者 nodeper 来自 Go语言

Golang Go语言中接口的作用体现在哪里?

初学 Golang,对于接口部分有一些不太理解的地方,希望 V 友能帮忙解答一下。

package main

import "fmt"

type Stringer interface {
	String() string
}

type Printer interface {
	Stringer // 接口嵌入。
	Print()
}

type User struct {
	id   int
	name string
}

func (self *User) String() string {
	return fmt.Sprintf("user %d, %s", self.id, self.name)
}

func (self *User) Print() {
	fmt.Println(self.String())
}

func main() {
	var t Printer = &User{1, "Tom"} // *User 方法集包含 String、Print。
	// 如果去掉接口定义的代码,将上一行代码替换为下行,也可以运行,请问接口的作用体现在哪里?
	// var t := User{1, "Tom"}
	t.Print()
}

以上代码摘录自Go 边看边练 -《 Go 学习笔记》系列(十二)

书上写了接口声明一个方法的签名。声明一个空方法集的接口类型,并将其作为函数参数,函数不会检查传入的是什么类型,只要这个参数满足接口定义即可,即可以通过编译器检查(个人理解)。另外,接口可以进行接口检查,接口嵌入等。我学到了这些理论知识,但对接口缺乏感性的认识。

相对于不定义接口,「直接定义结构体和结构体上的方法」的方式,额外定义了接口会带来什么好处么?

可以举几个实际的例子么?


更多关于Golang Go语言中接口的作用体现在哪里?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

12 回复

接口跟语言无关,无非是为了抽象,具体说就是为了解耦,隔离变化。Go 语言中的接口跟 Java 中的大同小异,最大的区别就是 Go 语言的 Interface 是 Duck Typing,无侵入式的,另外我建议你不要用这个教程学习 Go 语言,教程里的例子为了举例而举例,对初学者而言完全没有任何意义。英文好的话直接看英文教程,推荐两本书,《 The Go Programming Language 》《 The Way To Go 》,英语对于程序员的重要性再怎么强调都不为过!

更多关于Golang Go语言中接口的作用体现在哪里?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


上面两本电子书找不到的话,可以访问我的百度网盘分享链接: https://pan.baidu.com/s/1mic0v00
里面有很多经典的计算机类的 PDF 电子书

其实面向对象的问题.

如果你初学编程的话, 我非常建议你跳过这部分, 因为需要你做一些项目才能理解其作用 ,特别是需要多人合作的项目

------

举个栗子, 如果你写了一个类, 一年后你对这个类不满意, 你想重新实现一个, 那为了保证兼容性, 你肯定不能完全写个新的对吧.

那你肯定要理清这个类提供了哪些公开的 api, 那你就得到了一个接口

然后根据这些 api 去实现一个新的类, 然后用这个新的类去替换旧代码.

-------

下面是更好的方案

那其实更好的方式是, 在刚开始写这个类的时候就想好这个类可以提供哪些方法, 然后定义一个接口, 然后一年后你写个新的, 你直接实现这个接口就好了, 而不用理清. 另外, 试想, 如果写这个新类的人是你同事, 让他去理清这些公开 api, 他应该会很头疼, 甚至直接放弃这个需求了吧.

------

除了修改和重构上的方便外, 对调用方来说也是非常重要的, 这个涉及到多态, 然后你联想一下设计模式, 还有为什么允许var t Printer = &User{1, "Tom"}, 甚至推荐这种用法, 这就是你要思考的问题啦~

#1 感谢解答。正在看这两本书,看到接口的部分看不大明白,谷歌到的一个解释接口的文章,顺手贴出来了。书中说,Golang 语言中接口和满足接口的类型之间没有显式的连接,有时有的自定义类型可以同时满足多个接口,使用起来不会带来困惑么?

这就是语言的哲学,也是面向对象的进一步理解。面向对象应该基于协议,接口。组合优先于继承,既然满足了接口,那么就应该认为这里的对象就是一类。

#3 感谢解答。之前写过一些 JS,对 OOP 一直没啥概念,听了你的解释明白了很多东西。谢谢!

golang 的接口就是一系列方法的集合

我也是在了解了 golang 的接口之后才对计算机里面的指令和数据有了更进一步的了解

实际使用下 go 的压缩、加密库就能够理解接口的作用了。
加密、压缩传入 Writer 接口,输出的还是兼容 Writer,只要需求方实现了 Write 方法都能使用,不用管是文件还是连接。

面向接口编程啊,无论是过程式的还是对象式的,都可以实现接口和实现的分离。

感觉卵用没有,没有默认的接口实现

在Golang(Go语言)中,接口的作用主要体现在以下几个方面:

  1. 定义行为规范:接口定义了一组方法签名,但不实现这些方法。它们为实现了这些方法的类型提供了一种契约或行为规范。这有助于确保不同类型的对象在调用相同方法时表现出一致的行为。

  2. 实现多态性:通过接口,可以实现类似面向对象编程中的多态性。不同的类型可以实现相同的接口,从而在运行时动态地选择调用哪个实现。这增强了代码的灵活性和可扩展性。

  3. 解耦代码:接口有助于将代码的调用方和被调用方解耦。调用方只需要知道接口提供的方法,而不需要关心具体的实现细节。这有助于降低代码的耦合度,提高模块化的程度。

  4. 模拟多重继承:虽然Go语言不支持传统的类继承,但接口可以实现类似多重继承的效果。一个类型可以同时实现多个接口,从而组合多个行为。

  5. 便于单元测试:接口使得编写单元测试更加容易。可以通过创建接口的模拟(mock)实现来替代真实的依赖,从而在不依赖外部资源的情况下测试代码的逻辑。

总的来说,接口在Go语言中是一种强大的工具,它们提高了代码的灵活性、可维护性和可扩展性。通过合理使用接口,可以构建出更加健壮和易于维护的软件系统。在Go语言的开发中,接口的使用是不可或缺的一部分,也是Go语言设计哲学的重要体现。

回到顶部