type 接口类型名 interface{方法名1(参数列表1)返回值列表1方法名2(参数列表2)返回值列表2...
}
package mainimport "fmt"//定义接口
type EatWhat interface {EatMeat(data interface{})error
}//定义类型结构
type me struct {
}//定义的me类型实现接口
func (I *me)EatMeat(data interface{})error{fmt.Println("I like eat meat:!!!!: data:",data)return nil
}func main(){//实例化me结构体fm := new(me)//声明一个EatWhat的接口var ew EatWhat//将接口赋值结构体的实例化,即me类型ew = fmew.EatMeat("dataaaaaa")
}
结果:
package mainimport "fmt"//定义接口
type EatWhat interface {EatMeat(data interface{})errorLikeSleep()bool
}//定义类型结构
type me struct {
}//定义的me类型实现接口
func (I *me)EatMeat(data interface{})error{fmt.Println("I like eat meat:!!!!: data:",data)return nil
}
//必须得所有方法都实现
func (I *me)LikeSleep()bool{return true
}func main(){//实例化me结构体fm := new(me)//声明一个EatWhat的接口var ew EatWhat//将接口赋值结构体的实例化,即me类型ew = fmew.EatMeat("dataaaaaa")fmt.Println(ew.LikeSleep())
}
结果:
package mainimport "fmt"//定义接口
type EatWhat interface {EatMeat(data interface{})errorLikeSleep()bool
}//定义类型结构1
type me struct {
}//定义的me类型实现接口
func (I *me)EatMeat(data interface{})error{fmt.Println("I like eat meat:!!!!: data:",data)return nil
}
func (I *me)LikeSleep()bool{return true
}func main(){//实例化me结构体fm := new(me)//声明一个EatWhat的接口var ew EatWhat//将接口赋值结构体的实例化,即me类型ew = fmew.EatMeat("dataaaaaa")fmt.Println(ew.LikeSleep())
}
结果:
package mainimport "fmt"//定义接口
type EatWhat interface {EatMeat(data interface{})errorLikeSleep()bool
}//定义类型结构1
type me struct {
}
//定义类型结构2
type he struct {
}
//定义类型结构3
type she struct {
}//定义的me类型实现接口
func (I *me)EatMeat(data interface{})error{fmt.Println("I like eat meat:!!!!: data:",data)return nil
}
func (I *me)LikeSleep()bool{return true
}//定义的he类型实现接口
func (H *he)EatMeat(data interface{})error{fmt.Println("he does not like meat!!!data:",data)return nil
}
func (H *he)LikeSleep()bool{return true
}//定义的she类型实现接口
func (S *she)EatMeat(data interface{})error{fmt.Println("she also likes meat!!!Data:",data)return nil
}
func (S *she)LikeSleep()bool{return false
}func main(){//实例化me结构体fm := new(me)fh := new(he)fs := new(she)//声明一个EatWhat的接口var ew EatWhat//将接口赋值结构体的实例化,即me类型ew = fmew.EatMeat("dataaaaaa")fmt.Println(ew.LikeSleep())ew = fhew.EatMeat("hhhhhhh")fmt.Println(ew.LikeSleep())ew = fsew.EatMeat("ssssssss")fmt.Println(ew.LikeSleep())
}
结果:
//系统中io包中定义了写入器,关闭器和写入关闭器
type Writer interface {Write(p []byte)(n int, err error)
}
type Closer interface {Closer() error
}
type WriteCloser interface {WriterCloser
}
package mainimport ("fmt""io"
)type mystr struct {
}func (ms *mystr)Write(p []byte)(n int, err error){fmt.Println("!!!!write!!!!!")return n, nil
}
func (ms *mystr)Close()error{fmt.Println("!!!!close!!!!!")return nil
}
func main(){//将自己的类型赋值给io包中的WriteCloser接口var ms io.WriteCloser = new(mystr)ms.Write(nil)ms.Close()var writeOnly io.Writer = new(mystr)writeOnly.Write(nil)}
结果:
package mainimport ("fmt"
)func main(){var x interface{}x = 200value, ok := x.(int)fmt.Println(value, ok)
}
结果:
package mainimport ("fmt"
)func main(){var x interface{}x = 200value, ok := x.(bool)fmt.Println(value, ok)
}
结果:
package mainimport ("fmt"
)func main(){var x interface{}x = nilvalue, ok := x.(int)fmt.Println(value, ok)
}
结果:
package mainimport "fmt"func getType(i interface{})error{switch i.(type) {case int:fmt.Println("the type of int")case bool:fmt.Println("ther type of bool")case string:fmt.Println("the type of string")case float64:fmt.Println("the type of float64")default:fmt.Println("the type of an other type")}return nil
}
func main(){var a inta = 10getType(a)var b boolb = truegetType(b)
}
结果:
Go语言中,空接口类型可以接收任意类型的数据,它只需要记录这个数据在哪,是什么类型的数据即可。使用eface结构体表示不带方法签名的空接口。
type eface struct {_type *_typedata unsafe.Pointer
}
相比之下,eface结构体维护的就是比较简单了。
(1)_type:存储了空接口所承载的具体的实体类型。
(2)data:保存了接口具体的值的数据指针。
具体:
package mainimport "fmt"type me struct {height float64weight float64
}func (I *me)GetHegiht()float64{return I.height
}
func (I *me)GetWegih()float64{return I.weight
}
func main(){var c interface{}I := me{208.33,49.99,}c = Ifmt.Println(I.GetWegih())
}
type iface struct{tab *itabdata unsafe.Pointer
}
type itab struct {iner *interfacetype_type *_typehash uint32_ [4]bytefun [1]uintptr
}
type interfacetype struct {type _typepkgpath namemhdr []imethod
}
package mainimport "fmt"type Clife interface {EatMeat(data interface{})errorLikeSleep(data interface{})error
}type me struct {height float64weight float64
}func (I *me)GetHegiht()float64{return I.height
}
func (I *me)GetWegih()float64{return I.weight
}func (I *me)EatMeat(data interface{})error{fmt.Println("I like eating meat!!!!!data:", data)return nil
}
func (I *me)LikeSleep(data interface{})error{fmt.Println("!!!I like sleeping!!!!!data:", data)return nil
}
func main(){var c ClifeI := me{208.33,49.99,}c = &Ifmt.Println(c.EatMeat("aaaaaaaa"))fmt.Println(c.LikeSleep("bbbbbbb"))
}