Golang培训班_Go语言中什么是接口?接口规则有哪些?
老男孩IT教育
行业新闻
2022年1月4日 16:47
接口是一个或多个方法签名的集合。任何类型的方法集中只要拥有该接口对应的全部方法签名。
接口是一个或多个方法签名的集合。任何类型的方法集中只要拥有该接口对应的全部方法签名。就表示它 "实现" 了该接口,无须在该类型上显式声明实现了哪个接口。对应方法,是指有相同名称、参数列表 (不包括参数名) 以及返回值,该类型也可以有其他方法。
接口赋值
对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,既无法修改复制品的状态,也无法获取指针。
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 : %v\n", u)
fmt.Printf("i.(User) : %v\n", 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) : %v\n", vi.(User))
fmt.Printf("pi.(*User) : %v\n", pi.(*User))
}
空接口
只有当接口存储的类型和对象都为nil时,接口才等于nil。
package main
import (
"fmt"
)
func main() {
var i interface{}
fmt.Printf("i => %v\n", i)
fmt.Printf("(i == nil) => %v\n", i == nil)
var p *int = nil
// i 指向 p,指向的对象是个nil,但是存在类型不是nil,是个指针
i = p
fmt.Printf("i => %v\n", i)
fmt.Printf("(i == nil) => %v\n", 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)
老男孩教育在教授学员技能和技巧的同时,提供多重就业服务。实行1对1就业服务,直至转正的就业跟踪,建立全面的、完备的就业服务体系。全企业真实案例结合理论实战、1对1的模拟面试,帮助学员从学校过渡到社会、从学员过渡到员工,无缝对接企业的工作岗位。
推荐阅读:
