为什么不能从net.go使用conn.ok()?

时间:2018-12-25 19:57:47

标签: go

我是从Python的背景来到Golang的,我试图将各种新概念包裹住。

我遇到的一件事是net.go中的此功能:

func (c *conn) ok() bool { return c != nil && c.fd != nil }

此函数由多种net.go方法调用,例如继续阅读:

// 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)

感谢任何指针...

3 个答案:

答案 0 :(得分:2)

从Go文档:

  

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

因此,不会导出ok函数,并且您不能在网络软件包之外访问它。

答案 1 :(得分:2)

Go不会使用公共/私有关键字来显示标识符。如果首字母是大写字母,则标识符被导出(公共);否则不是:

  • 大写首字母:该名称对于包裹的客户可见
  • 否则:软件包的客户端看不到名称(或_Name)

答案 2 :(得分:0)

net中没有像ok这样的字段或方法。 当您尝试读写conn时,您将得到err以及将其读取或写入连接的字节数。