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 причин.
Re: Stringer интерфейс, метод String
От: σ  
Дата: 05.03.24 21:01
Оценка: 4 (1)
https://www.google.com/search?q=go+stringer+pointer+value
Re[2]: Stringer интерфейс, метод String
От: k55 Ниоткуда  
Дата: 05.03.24 21:20
Оценка:
Здравствуйте, σ, Вы писали:

σ>https://www.google.com/search?q=go+stringer+pointer+value

Это хорошо когда знаешь что искать.

Понял, это как в C++ const методы могут быть вызваны у любых объектов, а неконстантные методы только у неконстантных объектов.
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.