Golang Go语言中为何可以这样传递参数
初学,有个疑惑的地方,例如
file, err := os.Open("/path/to/file.txt")
scanner := bufio.NewScanner(file)
这里 file 获传入 bufio.NewScanner ,但是文档写的是
func Open(name string) (*File, error)
func NewScanner(r io.Reader) *Scanner
这里接受的是参数是 r io.Reader ,为何 file 可以传过去,是否是因为 file 实现了接口导致的,我在文档里面也没有看到有提及,如果是这样在哪里可以看到哪些参数实现了哪些接口呢,不能要用的时候一个个去断言吧?
Golang Go语言中为何可以这样传递参数
更多关于Golang Go语言中为何可以这样传递参数的实战教程也可以访问 https://www.itying.com/category-94-b0.html
的确是因为 file 实现了 io.Reader 接口导致的。
这是 golang 的特点,不需要明确声明支持某个接口,只要函数名和参数类型一致,就可以认为实现了对应的接口。
https://tour.go-zh.org/methods/10
更多关于Golang Go语言中为何可以这样传递参数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
golang 的接口是 duck type ,只要实现了某个接口的所有方法就是实现了某个接口,用 Goland 跳转到源码,或者直接查 API 文档查看吧,目前貌似没有什么方便的方法一键查看。
是实现了接口,所以才可以传进去。背景知识可以先了解一下什么是鸭子类型。
首先你自己要清楚你想要干什么。判断有一个简单的办法是你有变量 abc 你试一试就知道了,一般 lsp 或者 ide 自动提示你是否满足接口。当然如果你如果只是单纯想找不同的实现,那估计是没地方了。不过后面这种情况没什么实际应用场景,大多是学习场景。
官方有一个词用的很准确:satisfy .
File type satisfy the io.Reader interface .
//io.go
type Reader interface {
Read(p []byte) (n int, err error)
}
goland 可以点击左侧绿色圈 找到 Reader 的所有实现
io.Reader 是个接口
在Golang(Go语言)中,参数的传递方式主要依赖于值传递和引用传递的概念,但Go有其独特之处,这主要体现在其数据类型和内存管理上。
-
值传递:在Go中,基本数据类型(如int、float、bool等)以及结构体(struct)等复合类型,在作为函数参数传递时,默认是值传递。这意味着函数接收的是参数的一个副本,函数内部对参数的修改不会影响到函数外部的原始变量。
-
引用传递的错觉:虽然Go语言没有直接的引用传递机制,但可以通过传递指针(pointer)来实现类似引用传递的效果。指针是一个变量,其存储的是另一个变量的内存地址。通过传递指针,函数可以间接访问和修改原始数据。这在使用大型结构体或切片(slice)时尤其有用,因为可以避免复制大型数据结构带来的性能开销。
-
切片和映射:值得注意的是,Go中的切片和映射(map)在传递时,虽然看似是值传递,但由于它们内部包含指向底层数据的指针,因此对切片或映射元素的修改会影响到原始切片或映射。这是Go语言设计上的一个巧妙之处,既保证了数据的安全性,又提高了效率。
综上所述,Go语言通过值传递和指针传递的结合,以及对切片和映射的特殊处理,提供了灵活且高效的参数传递机制。这种设计使得Go语言在保持简单性的同时,也具备了处理复杂数据结构的能力。