Golang中函数为什么会返回数据?
Golang中函数为什么会返回数据? https://play.golang.org/p/WhslChgdMQB
package main
import (
"fmt"
"io"
)
type phoneReader string
func (ph phoneReader) Read(p []byte) (int, error) {
count := 0
for i := 0; i < len(ph); i++ {
if ph[i] >= '0' && ph[i] <= '9' {
p[count] = ph[i]
count++
}
}
return count, io.EOF
}
func main() {
phone1 := phoneReader("+1(234)567 9010")
buffer := make([]byte, len(phone1))
phone1.Read(buffer)
fmt.Println(string(buffer)) // 12345679010
}
我的理解是否正确:在第24行,buffer变量是Read函数的数据源,函数执行完成后buffer也接收了结果?
接收者是phone1,我们传递的buffer作为容器,但Read函数返回(int, error),如果后续代码没有使用这两个返回值,为什么这个函数要返回它们呢?
如果make函数创建的不是引用(或者是引用?),那么我们传递给Read函数的是buffer的副本,那么在这种情况下,函数外部的buffer是如何被更新的呢?
更多关于Golang中函数为什么会返回数据?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
- 如果情况允许,可以忽略函数的返回结果
- 在你的例子中,make 创建了一个切片,而切片是一个结构体,它包含一个指向将要读取/写入数据区域的指针。请查阅 https://golang.org/doc/effective_go.html#allocation_make
func main() {
fmt.Println("hello world")
}
更多关于Golang中函数为什么会返回数据?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在 Go 语言中,函数返回数据是为了提供操作的状态信息,例如读取的字节数或错误情况。在你的代码中,Read 方法返回 (int, error) 是为了遵循 io.Reader 接口的约定,即使调用代码没有使用这些返回值,它们对于接口实现是必需的。int 表示实际读取的字节数,error 表示读取过程中是否发生错误(如 io.EOF 表示结束)。
关于 buffer 的更新:在 Go 中,切片(slice)是引用类型,当传递切片给函数时,函数内部对切片元素的修改会反映到原始切片上,因为切片底层指向同一个数组。因此,Read 方法通过参数 p []byte 修改了 buffer 的内容。
以下是你的代码示例,并添加了使用返回值的部分以说明其用途:
package main
import (
"fmt"
"io"
)
type phoneReader string
func (ph phoneReader) Read(p []byte) (int, error) {
count := 0
for i := 0; i < len(ph); i++ {
if ph[i] >= '0' && ph[i] <= '9' {
p[count] = ph[i]
count++
}
}
return count, io.EOF
}
func main() {
phone1 := phoneReader("+1(234)567 9010")
buffer := make([]byte, len(phone1))
n, err := phone1.Read(buffer) // 使用返回值
fmt.Printf("Read %d bytes: %s\n", n, string(buffer)) // 输出: Read 11 bytes: 12345679010
if err != nil {
fmt.Println("Error:", err) // 输出: Error: EOF
}
}
在这个例子中,n 捕获了读取的字节数,err 捕获了错误(这里是 io.EOF)。即使你不使用它们,Read 方法也必须返回这些值以正确实现接口。buffer 被更新是因为切片在函数间传递时共享底层数据。

