I am new to go.
1
package main
import (
"fmt"
)
type I interface {
M()
}
type T struct {
S string
}
func (t T) M() {
fmt.Println(t.S)
}
func main() {
var i I
i = T{"Hello"}
describe(i)
i.M()
}
func describe(i I) {
fmt.Printf("(%v, %T)\n", i, i)
}
({Hello}, main.T)
Hello
Program exited.
2
package main
import (
"fmt"
)
type I interface {
M()
}
type T struct {
S string
}
func (t T) M() {
fmt.Println(t.S)
}
func main() {
var i I
i = &T{"Hello"}
describe(i)
i.M()
}
func describe(i I) {
fmt.Printf("(%v, %T)\n", i, i)
}
(&{Hello}, *main.T)
Hello
Program exited.
3
package main
import (
"fmt"
)
type I interface {
M()
}
type T struct {
S string
}
func (t *T) M() {
fmt.Println(t.S)
}
func main() {
var i I
i = &T{"Hello"}
describe(i)
i.M()
}
func describe(i I) {
fmt.Printf("(%v, %T)\n", i, i)
}
(&{Hello}, *main.T)
Hello
Program exited.
4
package main
import (
"fmt"
)
type I interface {
M()
}
type T struct {
S string
}
func (t *T) M() {
fmt.Println(t.S)
}
func main() {
var i I
i = T{"Hello"}
describe(i)
i.M()
}
func describe(i I) {
fmt.Printf("(%v, %T)\n", i, i)
}
# example
./prog.go:21:6: cannot use T{…} (value of type T) as type I in assignment:
T does not implement I (M method has pointer receiver)
Go build failed.
So why did code 2 pass compile!!!
Methods and pointer indirection?
If code 4 fail compile code 2 also should fail compile?
What happen?