做个网站需要多少钱,郑州网站设计排行,怎么用ps做网站首页字,公共资源交易中心网本节也是GO核心部分#xff0c;很重要。 注#xff1a;由于导包语句已经在19讲#xff08;笔记19#xff1a;面向对象的引入#xff09;展示过了#xff0c;所以这里就不展示了。
一、定义与实现
(1)接口中可以定义一组方法#xff0c;但不需要实现#xff0c;不需要…本节也是GO核心部分很重要。 注由于导包语句已经在19讲笔记19面向对象的引入展示过了所以这里就不展示了。
一、定义与实现
(1)接口中可以定义一组方法但不需要实现不需要方法体。并且接口中不能包含任何变量。到某个自定义类型要使用的时候(实现接口的时候),再根据具体情况把这些方法具体实现出来。 (2)实现接口要实现所有的方法才算实现。 (3)Golang不需要显式的实现接口。Golang中没有implement关键字Golang中实现接口是基于方法的不是基于接口的例如 A接口a,b方法 B接口a,b方法 C结构体实现了a,b方法那么C实现了A接口也可以说实现了B接口只要实现全部方法即可和实际接口耦合性很低比Java松散得多。 (4)接口目的是为了定义规范具体由别人来实现即可。 示例首先在utils中定义接口结构体及方法
//接口的定义定义一组规则或规范由别人实现
type SayHello interface {Say() //声明没有实现的方法
}//接口的实现1.定义类型这里是结构体
type Chinese struct {
}
type American struct {
}//2.实现接口的方法具体实现
func (c Chinese) Say() {fmt.Println(你好)
}func (a American) Say() {fmt.Println(hello)
}//定义一个函数专门用于各国人打招呼接收被实现的接口变量
func Greet(s SayHello) {s.Say()
}然后在main中调用
func main() {c : utils.Chinese{}a : utils.American{}utils.Greet(c)utils.Greet(a)
}可能有些人看到我每次调用utils觉得麻烦那么这里就提一个问题如果用别名比如定义utils.Chinese为Chineseutils.Greet(c)还有效吗答案是否定的因为编译器不认为这两个是同一类型自然也就不认为新的类型实现了接口的方法所以别名定义后新类型也必须实现接口的方法
二、一些细节
【1】接口本身不能创建实例比如在Greet中添加以下代码会有警告
var ss SayHello
ss.Say()警告nil dereference in dynamic method call这表示ss是空引用空引用是无法进行任何操作的所以运行原来main中的代码一定会报错。 但是接口可以指向一个实现了该接口的变量比如在main中添加如下代码
var s utils.SayHello c
s.Say()这里s接收的不再是空引用而是实现了接口的结构体所以能调用接口的方法注意该类型结构体一定要实现方法不实现没法赋值。 【2】只要是自定义数据类型就可以实现接口不仅仅是结构体类型。示例uitils中的定义为
type MyInt intfunc (i MyInt) Say() {fmt.Println(hello, i)
}main中的调用为
func main() {var i utils.MyInt 10i.Say()
}【3】一个自定义类型可以实现多个接口示例 uitils中的定义为
type InterA interface {A1()
}
type InterB interface {B1()
}
type Stu struct {
}func (s Stu) A1() {fmt.Println(run A1)
}
func (s Stu) B1() {fmt.Println(run B1)
}main中的调用为
func main() {s : utils.Stu{}s.A1()s.B1()
}【4】一个接口可以继承多个接口,这时如果要实现该接口必须将继承接口的方法都实现。示例uitils中的定义为
type InterC interface {InterAInterBC1()
}func (s Stu) C1() {fmt.Println(run C1)
}main中的调用为
func main() {s : utils.Stu{}s.A1()s.B1()s.C1()
}【5】空接口可以接收所有类型未实现的非空接口除外可以理解为所有类型都实现了空接口。由于这个比较简单我就直接在main中写了用到了可变参数涉及的知识点丰富
func printInf(inf ...interface{}) {for _, value : range inf {fmt.Printf(%T , value)}
}
func main() {// 整浮字符串布数组函数指针切片映射结构体intg, float, str, b, arr : 1, 1.1, 1, true, [1]int{1}pointer, slice, fun : new(int), arr[:], func() {}mapp, stct : make(map[string]int, 2), utils.Stu{}// 创建一个切片包含所有变量inf : []interface{}{intg, float, str, b, arr, pointer, slice, fun, mapp, stct}// 传递切片作为参数注意加上...将切片展开printInf(inf...)
}程序输出为
int
float64
string
bool
[1]int
*int
[]int
func()
map[string]int
utils.Stu