接口值
接口值
接口也是值。它们可以像其它值一样传递。
接口值可以用作函数的参数或返回值。
在内部,接口值可以看做包含值和具体类型的 元组 : (value, type)
接口值保存了一个具体底层类型的具体值。
接口值调用方法时会执行其底层类型的同名方法。 package main import ( "fmt" "math" ) type I interface { M() } type T struct { S string } func (t *T) M() { fmt.Println(t.S) } type F float64 func (f F) M() { fmt.Println(f) } func main() { var i I i = &T{"Hello"} describe(i) i.M() i = F(math.Pi) describe(i) i.M() } func describe(i I) { fmt.Printf("(%v, %T)\n", i, i) }
x
1 package
main 2 3 import ( 4
"fmt" 5
"math" 6 ) 7 8 type
I
interface { 9
M () 10 } 11 12 type
T
struct { 13
S
string 14 } 15 16 func ( t
T ) M () { 17
fmt . Println ( t . S ) 18 } 19 20 type
F
float64 21 22 func ( f
F ) M () { 23
fmt . Println ( f ) 24 } 25 26 func
main () { 27
var
i
I 28 29
i
=
& T { "Hello" } 30
describe ( i ) 31
i . M () 32 33
i
=
F ( math . Pi ) 34
describe ( i ) 35
i . M () 36 } 37 38 func
describe ( i
I ) { 39
fmt . Printf ( "(%v, %T)\n" , i , i ) 40 } 41