为什么我的Golang定义方法没有在String()时隐式实现

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

It states Under the hood, interface values can be thought of as a tuple of a value and a concrete type

I define M as follows

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

This prints out ({Hello eee}, main.T){Hello eee} interface i has vaule {Hello eee} and type 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)
}

This prints out (ccccc, main.T)ccccc.

interface i has vaule ccccc and type main.T

Seems when i add String() as Stringer defined by the fmt package in script2. The String() is implemented implicitily,not sure why?

I thought in script2 i would have value "{Hello eee}" and type main.T

You should call fmt.Println(i.M()) ?
Why you want fmt call a function while its'n exist?

A Stringer is a type that can describe itself as a string. The fmt package (and many others) look for this interface to print values

Refer: https://golang.org/pkg/fmt/#Stringer

Stringer is implemented by any value that has a String method, which defines the “native” format for that value. The String method is used to print values passed as an operand to any format that accepts a string or to an unformatted printer such as Print.

In your case, in script1 you are just printing out the struct. In script2 you are providing what the builder should use when an unformatted print occurs which is a function that prints out "ccccc".