Golang 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
接口跟语言无关,无非是为了抽象,具体说就是为了解耦,隔离变化。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 的接口就是一系列方法的集合
实际使用下 go 的压缩、加密库就能够理解接口的作用了。
加密、压缩传入 Writer 接口,输出的还是兼容 Writer,只要需求方实现了 Write 方法都能使用,不用管是文件还是连接。
面向接口编程啊,无论是过程式的还是对象式的,都可以实现接口和实现的分离。
感觉卵用没有,没有默认的接口实现
在Golang(Go语言)中,接口的作用主要体现在以下几个方面:
-
定义行为规范:接口定义了一组方法签名,但不实现这些方法。它们为实现了这些方法的类型提供了一种契约或行为规范。这有助于确保不同类型的对象在调用相同方法时表现出一致的行为。
-
实现多态性:通过接口,可以实现类似面向对象编程中的多态性。不同的类型可以实现相同的接口,从而在运行时动态地选择调用哪个实现。这增强了代码的灵活性和可扩展性。
-
解耦代码:接口有助于将代码的调用方和被调用方解耦。调用方只需要知道接口提供的方法,而不需要关心具体的实现细节。这有助于降低代码的耦合度,提高模块化的程度。
-
模拟多重继承:虽然Go语言不支持传统的类继承,但接口可以实现类似多重继承的效果。一个类型可以同时实现多个接口,从而组合多个行为。
-
便于单元测试:接口使得编写单元测试更加容易。可以通过创建接口的模拟(mock)实现来替代真实的依赖,从而在不依赖外部资源的情况下测试代码的逻辑。
总的来说,接口在Go语言中是一种强大的工具,它们提高了代码的灵活性、可维护性和可扩展性。通过合理使用接口,可以构建出更加健壮和易于维护的软件系统。在Go语言的开发中,接口的使用是不可或缺的一部分,也是Go语言设计哲学的重要体现。