Почему я не могу использовать conn.ok () из net.go? - PullRequest
0 голосов
/ 25 декабря 2018

Я прихожу в Голанг из Python и пытаюсь обернуть голову вокруг различных новых концепций.

Одна вещь, с которой я столкнулся, - это функция в 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
}

Я пытаюсь понять, как метод ok() можно вызывать на conn, несмотря на то, чточто 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 голосов
/ 25 декабря 2018

Go не использует публичные / приватные ключевые слова для видимости идентификатора.Если начальный символ является заглавной буквой, идентификатор экспортируется (общедоступный);в противном случае это не так:

  • заглавная буква верхнего регистра: имя является видимым для клиентов пакета
  • в противном случае: имя (или _Name) не отображается для клиентов пакета
0 голосов
/ 26 декабря 2018

В net.Conn нет поля или метода, как ok. Что говорит ошибка, и это правильно.когда вы пытаетесь читать и записывать в коннект, вы получите ошибку и количество прочитанных байтов или запишите это в соединение.

0 голосов
/ 25 декабря 2018

Из документа Go:

Идентификатор может быть экспортирован, чтобы разрешить доступ к нему из другого пакета. Идентификатор экспортируется, если первым символом имени идентификатора является заглавная буква Юникода

Итак, функция ok не экспортируется, и вы не можете получить к ней доступ вне сети.пакет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...