Stringer интерфейс, метод String
От: k55 Ниоткуда  
Дата: 05.03.24 20:30
Оценка:
День добрый.
В Go я полный ноль. Поэтому читаю вскую документацию.
Наткнулся на вот такой пример: https://go.dev/tour/methods/18

Поясните пожалуйста, почему в данном примере если все оставить как есть, то напечатается два раза "0.0.0.0",

package main

import "fmt"

type IPAddr [4]byte

func (v IPAddr) String() string {
    return "0.0.0.0"
}

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


https://ideone.com/lIeMk8

если же заменить сигнатуру на

func (v *IPAddr) String() string


то будет вызван иной метод преобразования и напечатаются реальные значения.


Допустим fmt.Printf ищет interface Stringer, но в интерфейсе не указывается указатель ли это или нет.
Опять же, согласно этому примеру https://go.dev/tour/methods/7 GO сам берет указатель если сильно надо и наоборот.

Спасибо!
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.