Функция выполняет себя без вызова - PullRequest
0 голосов
/ 19 декабря 2018

Я начал изучать Go вчера на сайте Tour of Go, и я подумал, что все хорошо понимаю;

Но потом я был совершенно сбит с толку в упражнении Стрингеры: https://tour.golang.org/methods/18

Так что я искал решение, чтобы увидеть, что я делаю неправильно, и нашел это:

package main

import "fmt"

type IPAddr [4]byte

// TODO: Add a "String() string" method to IPAddr.

func (i IPAddr) String() string {
    return fmt.Sprintf("%d.%d.%d.%d", i[0], i[1], i[2], i[3])   

 }

func main() {
    hosts := map[string]IPAddr{
        "loopback":  {127, 0, 0, 1},
        "googleDNS": {8, 8, 8, 8},
    }
    for name, ip := range hosts {
        fmt.Printf("%v: %v\n", name, ip)
    }
}

, и вывод такой:

loopback: 127.0.0.1
googleDNS: 8.8.8.8

это оставило меня в полном замешательстве;

Почему функция активировала себя?Разве это не должно быть похоже на: i.String () внутри основной функции?

Почему fmt.Printf вообще ничего не показывает на экране?

Или fmt.Printf вернул этопотому что String () изменил значение?

Извините, если вопрос сбивает с толку, но кто-то может мне это объяснить?

1 Ответ

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

Если вы посмотрите на предыдущую страницу в руководстве , вы увидите, что Stringer - это интерфейс , определенный в пакете fmt.Реализация String() метода автоматически заставляет IPAddr реализовать этот интерфейс.

Функция fmt.Printf проверяет, реализует ли ее аргумент интерфейс Stringer.Поскольку теперь это так, он вызывает метод String, когда ему нужно выяснить, как показать IPAddress (вы можете изменить это поведение, используя спецификатор формата, отличный от %v, но это выходит за рамки вопроса).

Вызов fmt.Printf что-то показал;это показывало линии

loopback: 127.0.0.1
googleDNS: 8.8.8.8

Это не изменило их значение или что-то еще;он просто вызвал метод String, чтобы выяснить, как записать IPAddr, и записал его таким образом.

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