当我运行fmt时。在golang中打印ln(*os.Stdin(,输出是此内存地址{0xc000182000}这个地址意味着什么?阅读是如何进行的?
找到正在发生的事情的最佳方法是查看标准库中的代码。最简单的方法就是用谷歌搜索:
https://www.google.com/search?q=os.Stdin
的前几个链接中有一个URL
pkg.go.dev/os
在那里你可以找到Stdin:的定义
Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin")
那么NewFile生成什么函数呢?
https://pkg.go.dev/os#NewFile
NewFile返回一个具有给定文件描述符和名称的新文件。如果fd不是有效的文件描述符,则返回的值将为nil。在Unix系统上,如果文件描述符处于非阻塞模式,NewFile将尝试返回一个可轮询的文件(SetDeadline方法适用于该文件(。在将其传递给NewFile之后,fd可能在fd方法的注释中描述的相同条件下变得无效,并且应用相同的约束。
这意味着NewFile将返回指向表示文件的结构的指针。
// File represents an open file descriptor.
type File struct {
*file // os specific
}
好的,这意味着os。表示文件的Stdin。但是,我们能用File结构上的指针做什么呢?如果我们将其用作fmt的参数。Println我们得到指针存储在内存中的地址。但该结构具有Read方法。我们可以在os/File.go文件中找到为该File结构实现的所有方法。
https://cs.opensource.google/go/go/+/refs/tags/go1.17.5:src/os/file.go;l=112;drc=a25c58462992704 dbb6819769f530b6cc6a8ebe3
有一个Read方法,它将底层文件中的字节读取到作为方法参数提供的字节数组中。
package main
import (
"fmt"
"io"
"log"
"os"
)
func main() {
byteSlice := []byte{}
b1 := make([]byte, 1)
for {
_, err := os.Stdin.Read(b1)
if err == io.EOF {
break
}
if err != nil {
log.Printf("Unknown error: %+v ", err.Error())
os.Exit(1)
}
byteSlice = append(byteSlice, b1...)
}
fmt.Printf("we read: %s n", string(byteSlice))
}
此代码效率极低,应仅用于演示目的。但我希望你能从操作系统中了解如何阅读。Stdin和Stdin代表什么。