Почему мой метод, определенный Golang, не реализован неявно, в то время как String () делает - PullRequest
0 голосов
/ 21 ноября 2018

In https://tour.golang.org/methods/11

В нем говорится, что под интерфейсом значения интерфейса могут рассматриваться как кортеж значения и конкретного типа

Я определяю M следующим образом

script1

package main

import (
    "fmt"
)

type I interface {
    M() string
}
type T struct {
    S string
    w string
}
func (t T) M() string {
    return "dddd"
}
func main() {
    var i I
    i = T{"Hello","eeee"}  
    fmt.Printf("(%v, %T)", i, i)    
    fmt.Println(i)
}

Это распечатывает ({Hello eee}, main.T){Hello eee} интерфейс, который у меня есть vaule {Hello eee}, и введите main.T

script2:

package main

import (
    "fmt"
)

type I interface {
    M() string
}
type T struct {
    S string
    w string
}
func (t T) M() string {
    return "dddd"
}
func (t T) String() string {
    return "ccccc"
}
func main() {
    var i I
    i = T{"Hello","eeee"}
    fmt.Printf("(%v, %T)", i, i) 
    fmt.Println(i)
}

Это распечатывает (ccccc, main.T)ccccc.

интерфейс, у меня есть vaule ccccc и тип main.T

Кажется, когда я добавляю String () как Stringer, определенный какпакет fmt в script2.String () реализован неявно, не уверен почему?

Я думал, что в script2 у меня будет значение "{Hello eee}" и тип main.T

Ответы [ 2 ]

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

См .: https://golang.org/pkg/fmt/#Stringer

Stringer реализуется любым значением, имеющим метод String, который определяет «собственный» формат для этого значения.Метод String используется для печати значений, переданных в качестве операнда, в любой формат, который принимает строку, или на неформатированный принтер, такой как Print.

В вашем случае, в script1 вы просто распечатываете структуру,В script2 вы указываете, что следует использовать при создании неотформатированной печати. ​​Это функция, которая выводит «ccccc».

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

Вам следует вызвать fmt.Println(i.M())?
Почему вы хотите, чтобы fmt вызывал функцию, пока ее нет?

A Stringer - это тип, который может описывать себя как строку.Пакет fmt (и многие другие) ищет этот интерфейс для печати значений

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