GoLang学习笔记(三十四)接口及空接口

面向对象语言中,接口用于定义对象的行为。接口只指定对象应该做什么,实现这种行为的方法是由对象来决定的。
在Go语言中,接口是一组方法签名。
接口只指定了类型应该具备有的方法,类型决定了如何实现这些方法。
当某个类型为了接口中的所有方法提供了具体的实现细节时,这个类型就被称为实现了该接口。
接口定义了一组方法,如果某个对象实现了该接口的所有方法,则此对象就实现了该接口。
Go语言的类型都是隐式实现接口的。任何定义了接口中所有方法的类型都被称为隐式地实现了该接口。

1、定义接口:
type 接口名称 interface{
    方法1([参数列表]) [返回值]
    方法2([参数列表]) [返回值]
    ...
    方法n([参数列表]) [返回值]
}
2、定义结构体:
type 结构体名 struct{
    //属性
}
3、实现接口方法:
func (变量名 结构体类型) 方法1([参数列表]) [返回值]{
    //方法体
}
func (变量名 结构体类型) 方法2([参数列表]) [返回值]{
    //方法体
}
...
func (变量名 结构体类型) 方法n([参数列表]) [返回值]{
    //方法体
}

type phone interface {
	call()
}

type andriod struct {
}

type iphone struct {
}

func (a andriod) call() {
	fmt.Printf("我是安卓手机,开始打电话! \n")
}

func (i iphone) call() {
	fmt.Printf("我是苹果手机,开始打电话! \n")
}

func testInterface01() {
	var p1 phone
	p1 = new(andriod)
	fmt.Printf("变量p1的类型:%T,值:%v,指针:%p \n", p1, p1, p1)
	p1.call()

	p1 = new(iphone)
	fmt.Printf("变量p1的类型:%T,值:%v,指针:%p \n", p1, p1, p1)
	p1.call()
}

运行testInterface01()函数,你会发现变量类型是指针。

func testInterface02() {
	var p1 phone
	p1 = andriod{}
	fmt.Printf("变量p1的类型:%T,值:%v,指针:%p \n", p1, p1, &p1)
	p1.call()

	p1 = iphone{}
	fmt.Printf("变量p1的类型:%T,值:%v,指针:%p \n", p1, p1, &p1)
	p1.call()
}

运行testInterface02()函数,你会发发现变量类型不再是指针。

得出使用new()函数生成的结构体是结构体的指针类型。

 

空接口

空接口:该接口红没有任何的方法。任意类型都可以实现该接口
空接口的定义:interface{} 也就是包含0个方法的接口
空接口表示任意数据类型,类似于java中的object

空接口例子:

type a interface {
}

type cat struct {
	name string
	age  int
}

type person struct {
	name string
	sex  bool
}

func showEntity(a a) {
	fmt.Printf("变量类型:%T,变量的值%v \n", a, a)
}

func testNilInterface1() {
	var nif1 a = cat{"miaomiao", 3}
	var nif2 a = person{"ketty", true}
	var nif3 a = "hello hello hello"
	var nif4 a = 1234567
	var nif5 a = 3.14157

	showEntity(nif1)
	showEntity(nif2)
	showEntity(nif3)
	showEntity(nif4)
	showEntity(nif5)
}

空接口的常用情况:

func testNilInterface2() {
	//1、println的参数就是空接口
	fmt.Println("hehehehehe", 1234567, 3.14157, cat{"mimi", 2}, person{"ketty", false})

	//2、定义一个map:key是string,value是任意数据类型
	map1 := make(map[string]interface{})
	map1["name"] = "dani"
	map1["age"] = 33
	map1["sex"] = true
    fmt.Println(map1)

	//3、定义一个切片,其中存储任意类型的数据
	slice1 := make([]interface{},0,10)
	slice1 = append(slice1,1234567,"heiheihei",3.14157,cat{"xueqiu",2},person{"danni",true})
    fmt.Println(slice1)
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 golang 学习笔记,希望对你有帮助: ### 1. 基本语法 - 包声明:每个 Go 程序都是由多个包组成,使用 `package` 声明包名。 - 引入包:使用 `import` 关键字引入需要的包。 - 函数:使用 `func` 关键字声明函数,函数可以有多个返回值。 - 变量:使用 `var` 关键字声明变量。 - 常量:使用 `const` 关键字声明常量。 - 控制语句:Go 语言支持条件语句和循环语句,例如 `if`、`switch`、`for` 等。 ### 2. 数据类型 Go 语言支持以下数据类型: - 布尔型:`bool` - 数字类型:`int`、`int8`、`int16`、`int32`、`int64`、`uint`、`uint8`、`uint16`、`uint32`、`uint64`、`uintptr`、`float32`、`float64`、`complex64`、`complex128` - 字符串类型:`string` - 派生类型:`array`、`slice`、`map`、`struct`、`interface`、`channel` ### 3. 函数 Go 语言中的函数可以有多个返回值,可以使用命名返回值来使函数更加清晰易读。例如: ```go func swap(x, y string) (string, string) { return y, x } ``` ### 4. 数组和切片 Go 语言中的数组和切片都是支持多维的。数组和切片的区别在于数组长度是固定的,而切片长度可以动态变化。例如: ```go // 声明数组 var a [5]int // 声明切片 var s []int s = append(s, 1, 2, 3) ``` ### 5. 结构体 结构体是一种自定义的数据类型,可以包含多个不同类型的字段。例如: ```go type person struct { name string age int } func main() { p := person{"Bob", 20} fmt.Println(p.name, p.age) } ``` ### 6. 接口 接口定义了一组方法的集合,只要某个类型实现了接口中定义的所有方法,就可以认为它实现了这个接口。例如: ```go type Shape interface { area() float64 } type Circle struct { x, y, r float64 } func (c Circle) area() float64 { return math.Pi * c.r * c.r } func main() { var s Shape s = Circle{x: 0, y: 0, r: 5} fmt.Println(s.area()) } ``` ### 7. 并发 Go 语言使用协程来实现并发,协程是一种轻量级的线程,可以在一个线程中同时执行多个协程。例如: ```go func main() { go say("world") say("hello") } func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } ``` 以上就是 golang 学习笔记的主要内容,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值