实现全部空接口类型的方法
定义空接口类型&指定实现方法
type Study interface {
Listen(msg string) string
Speak(msg string) string
Read(msg string) string
Write(msg string) string
}
限制实现所有方法 运行时阶段
第一种是在运行阶段,运行的时候,地址做对比,强类型语言,类型做对比.将*study的地址给了Study,而Study是interface{}类型,必须实现所有方法
package main
var _ Study = (*study)(nil)
type Study interface {
Listen(msg string) string
Speak(msg string) string
Read(msg string) string
Write(msg string) string
}
type study struct {
Name string
}
func (s *study) Listen(msg string) string {
return s.Name + " 听 " + msg
}
func (s *study) Speak(msg string) string {
return s.Name + " 说 " + msg
}
func (s *study) Read(msg string) string {
return s.Name + " 读 " + msg
}
//func (s *study) Write(msg string) string {
// return s.Name + " 写 " + msg
//}
func main() {
}
第二种 编译阶段
任何类型都实现interface类型,所以当bb实现aa的时候要实现,就必须实现所有的属性
如果说次接口没有被实现,那么一方面ide会有红横线出现,另一方面在编译的时候会出现报错。两方面的提示来保证写底层代码的接口是有被实现的。
package main
type aa interface {
listen(msg string) string
}
var _ aa = new(bb)
type bb struct {
}
//func (b *bb) listen(msg string) string {
// return ""
//}
如果没实现
new 和make
new占内存?
new:申请了内存,但是不会将内存初始化,只会将内存置零,返回一个指针。
make:申请了内存,返回已初始化的结构体的零值。
new 和make 的区别
new 返回的是地址
make 返回的内存空间
package main
import "fmt"
func main() {
a1 := new([]int)
a2 := &[]int{}
a3 := make([]int, 0)
fmt.Println(a1, a2, a3, a1 == a1)
fmt.Println(a1 == a2)
}
结果
&[] &[] [] true
false
第三种
第儿种是在运行调用阶段,调用此方法的时候没有实现
package main
import "fmt"
//var _ Study = (*study)(nil)
type Study interface {
Listen(msg string) string
Speak(msg string) string
Read(msg string) string
Write(msg string) string
}
type study struct {
Name string
Study
}
//func (s *study) Listen(msg string) string {
// return s.Name + " 听 " + msg
//}
func (s *study) Speak(msg string) string {
return s.Name + " 说 " + msg
}
func (s *study) Read(msg string) string {
return s.Name + " 读 " + msg
}
//func (s *study) Write(msg string) string {
// return s.Name + " 写 " + msg
//}
func main() {
studys := new(study)
studys.Write("rt")
fmt.Println(*studys)
studys = studys
}
一般grpc的方法实现用的是这个