Строковая функция в syscall.Errno - PullRequest
0 голосов
/ 27 ноября 2018

Прочитав раздел 7.8 «Языка программирования Go», я обнаружил следующий код:

var err error = syscall.Errno(2)
fmt.Println(err.Error()) // "no such file or directory"
fmt.Println(err)         // "no such file or directory"

Я понимаю первую и вторую строку.error интерфейс защищен syscall.Errno, поэтому доступна функция Error(), возвращающая string.

Я не понимаю третью.Просматривая источники syscall Я не могу найти место, где syscall.Errno удовлетворяет stringer interface - String() функция не определена.

Почему третий печатает строкупредставление sysscall.Errno?

1 Ответ

0 голосов
/ 27 ноября 2018

Ответ находится в документации fmt здесь :

Если формат (который неявно% v для Println и т. Д.) Действителен для строки (% s% q% v% x% X), применяются следующие два правила:

Если в операнде реализован интерфейс ошибки, будет вызван метод Error для преобразования объекта в строку, которая затем будет отформатирована в соответствии с требованиями глагола (если есть).

Если операнд реализует метод String () string, этот метод будет вызываться для преобразования объекта в строку, которая затем будет отформатирована в соответствии с требованиями глагола (если есть).

Таким образом, для любого значения, которое поддерживает оба, метод String() никогда не вызывается вообще, поскольку интерфейс error имеет преимущество перед интерфейсом Stringer.Вы можете проверить это с помощью программы, подобной этой :

package main

import (
    "fmt"
)

type foo string

func (f foo) String() string {
    return "string"
}

func (f foo) Error() string {
    return "error"
}

func main() {
    fmt.Println(foo(""))
}

Вывод:

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