Go语言接口规则
接口是一个或多个方法签名的集合。任何类型的方法集中只要拥有该接口对应的全部方法签名。就表示它 "实现" 了该接口,无须在该类型上显式声明实现了哪个接口。对应方法,是指有相同名称、参数列表 (不包括参数名) 以及返回值,该类型也可以有其他方法。
接口赋值
对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,既无法修改复制品的状态,也无法获取指针。
package main import "fmt" type User struct { id int name string } func main() { u := User{18, "oldboy"} var i interface{} = u u.id = 20 u.name = "Golang" fmt.Printf("u : %vn", u) fmt.Printf("i.(User) : %vn", i.(User)) }
运行结果:
u : {20 Golang} i.(User) : {18 oldboy}
接口转型返回临时对象,只有使用指针才能修改其状态。
package main import "fmt" type User struct { id int name string } func main() { u := User{18, "oldboy"} var vi, pi interface{} = u, &u // vi.(User).name = "Golang" pi.(*User).name = "Golang" fmt.Printf("vi.(User) : %vn", vi.(User)) fmt.Printf("pi.(*User) : %vn", pi.(*User)) }
空接口
只有当接口存储的类型和对象都为nil时,接口才等于nil。
package main import ( "fmt" ) func main() { var i interface{} fmt.Printf("i => %vn", i) fmt.Printf("(i == nil) => %vn", i == nil) var p *int = nil // i 指向 p,指向的对象是个nil,但是存在类型不是nil,是个指针 i = p fmt.Printf("i => %vn", i) fmt.Printf("(i == nil) => %vn", i == nil) }
运行结果:
i => <nil> (i == nil) => true i => <nil> (i == nil) => false
接口实现
接口只有方法声明,没有数据字段,没有实现,也不需要显示的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口。
package main import ( "fmt" ) type Info interface { GetAge() int GetName() string } type User struct { name string age int } func (u User) GetAge() int { return u.age } func (u User) GetName() string { return u.name } func main() { var user Info = User{"oldboy", 18} age := user.GetAge() name := user.GetName() fmt.Println(age, name) }
如果一个变量含有了多个interface类型的方法,那么这个变量就实现了多个接口。
package main import ( "fmt" ) type Age interface { GetAge() int } type Name interface { GetName() int } type User struct { name string age int } func (u User) GetAge() int { return u.age } func (u User) GetName() string { return u.name } func main() { user := User{"oldboy", 18} age := user.GetAge() name := user.GetName() fmt.Println(age, name) }
如果一个变量只含有了一个interface的部分方法,那么这个变量没有实现这个接口。
package main import ( "fmt" ) type Info interface { GetAge() int GetName() string } type User struct { name string age int } func (u User) GetAge() int { return u.age } func main() { var user Info = User{"oldboy", 18} age := user.GetAge() fmt.Println(age) }
编译错误:
./main.go:22:6: cannot use User literal (type User) as type Info in assignment: User does not implement Info (missing GetName method)
特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。
- 赞助本站
- 微信扫一扫
-
- 加入Q群
- QQ扫一扫
-
评论