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

2 回复
  1. 如果情况允许,可以忽略函数的返回结果
  2. 在你的例子中,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 被更新是因为切片在函数间传递时共享底层数据。

回到顶部