为什么我不能使用net.go中的conn.ok()?

为什么我不能使用net.go中的conn.ok()?,go,Go,我是从Python的背景来到Golang的,我正试图围绕各种新概念来思考 我遇到的一件事是net.go中的函数: func (c *conn) ok() bool { return c != nil && c.fd != nil } 此函数由多个net.go方法调用,例如conn.Read: // Read implements the Conn Read method. func (c *conn) Read(b []byte) (int, error) { if

我是从Python的背景来到Golang的,我正试图围绕各种新概念来思考

我遇到的一件事是net.go中的函数:

func (c *conn) ok() bool { return c != nil && c.fd != nil }
此函数由多个net.go方法调用,例如conn.Read:

// Read implements the Conn Read method.
func (c *conn) Read(b []byte) (int, error) {     
if !c.ok() {        
    return 0, syscall.EINVAL
}
我试图理解如何在conn上调用ok方法,尽管ok似乎不是conn的接口

当然,我似乎无法从我的客户端代码调用ok:

func main() {
conn, err := net.Dial("tcp", "www.reddit.com:80")
if err != nil {
    os.Exit(-1)
}
fmt.Println(&conn.ok())
}
输出:

./server.go:14:22: conn.ok undefined (type net.Conn has no field or method ok)
感谢Go文档中的任何提示…

可以导出标识符以允许从另一个标识符访问它 包裹如果标识符的第一个字符 标识符的名称是一个Unicode大写字母


因此,ok函数不会导出,您不能在net package之外访问它。

Go不使用公共/私有关键字来查看标识符。如果初始字符为大写字母,则标识符为exportedpublic;否则,它不是:

大写首字母:名称对包的客户端可见 否则:名称或_名称对包的客户端不可见
在net.Conn中,没有像ok这样的字段或方法可以证明错误所说的是正确的。 当您尝试读取和写入conn时,您将得到err和读取或写入连接的字节数。

接口名为conn,与conn小写类型不同。