首先简单的描述一下golang中的struct interface的作用。
简单来说struct代表的是一种结构,比如user有name和age,那么这两个属性就在struct中。而一个struct拥有什么样的行为需要有对应的方法来支持。
代码语言:javascript复制type user struct{
Name string
Age int
}
比如上面的user结构体,如果想让user有其他的行为需要给user添加方法,添加的时候需要区分是值还是指针。
代码语言:javascript复制func (u *User) speak() {
fmt.Println("i am " u.name)
}
func (u User) doSome(){
fmt.Println("do something")
}
使用值还是指针取决于这个类型的本质,不仅仅取决于本次方法中对struct是否有修改来判断。
为了让结构体的方法更有章法,或者为了多态,可以使用接口对方法进行约束,让方法实现接口,这样就起到了规范方法,针对接口编程而不是实现编程。
具体如下:
代码语言:javascript复制package demo
import (
"fmt"
)
type sayer interface {
speak()
}
type User struct {
name string
age int
}
type Student struct {
name string
age int
}
func NewUser(name string, age int) User {
return User{
name: name,
age: age,
}
}
func NewStudent(name string, age int) Student {
return Student{
name: name,
age: age,
}
}
func (u *User) speak() {
fmt.Println("i am " u.name)
}
func (s *Student) speak() {
fmt.Println("student-----------:" s.name)
}
func BaseSay(s sayer) {
s.speak()
}
具体使用:
代码语言:javascript复制package main
import "test/demo"
func main() {
u := demo.NewUser("aa", 1)
s := demo.NewStudent("bbbbbbbb", 2)
demo.BaseSay(&u)
demo.BaseSay(&s)
}
通过实现同样的接口,在调用的时候使用不同的类,实现执行不同的方法。
运行结果: