go语言基础(四)包,接口

本文详细探讨了Go语言中的接口概念,包括接口类型定义、动物Say接口使用、空接口的场景应用、类型断言的技巧以及如何配合switch进行状态判断。通过实例演示,展示了面向接口编程在实践中的价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

包的话我感觉没啥可说的,需要注意的是比如有两个包,一个main一个func包,如果func包的函数或变量名开头小写,其他包是无法访问这个函数或者变量的。

go语言包如果不使用的话会报错,所以会自动删除不使用的包

这时候还会涉及两个包的写法,一种是给包换个名字例如:
import (
myfmt “fmt”
)
还有一种写法,是匿名引入包,有啥好处呢?就是调用这个包的init函数,但不会用这个包其他的函数或者方法,例如
import (
_ “fmt”
)

接口

接口类型就像是一种约定——概括了一种类型应该具备哪些方法,在Go语言中提倡使用面向接口的编程方式实现解耦。

接口是一种由程序员来定义的类型,一个接口类型就是一组方法的集合,它规定了需要实现的所有方法。

相较于使用结构体类型,当我们使用接口类型说明相比于它是什么更关心它能做什么。

接口定义格式:

type 接口类型名 interface{
    方法名( 参数列表 ) 返回值列表
}

接口简单使用体会

package main

import "fmt"

type Dog struct {
	name string
	age  int
}

type Cat struct {
	name string
	age  int
}

func (dog Dog) Say() {
	fmt.Printf("dog name =%s,age = %d\n", dog.name, dog.age)
}

func (cat Cat) Say() {
	fmt.Printf("cat name =%s,age = %d\n", cat.name, cat.age)
	fmt.Println("小梨花爱上了阿拉斯加")
}

//定义了一个接口,不管你什么类型,它只管实现了什么方法
//定义一个类型,一个抽象的类型,只要实现了say方法的类型都可以称为animalSay类型
type animalSay interface {
	Say()
}

func do(a animalSay) {
    //不管传进来的是什么,就会执行他的Say方法
	a.Say()
}

func main() {
	mainDog := Dog{
		name: "阿拉斯加",
		age:  100,
	}

	mainCat := Cat{
		name: "小梨花",
		age:  44,
	}

	do(mainDog)
	do(mainCat)
}

Operation results:
dog name =阿拉斯加,age = 100
cat name =小梨花,age = 44
小梨花爱上了阿拉斯加

空接口

空接口常用的两种场景:

  1. 使用空接口实现可以接收任意类型的函数参数。
  2. 使用空接口实现可以保存任意值的字典。
package main

import "fmt"

//空接口
//接口中没有定义任何需要实现的方法时,该接口就是一个空接口
//任意类型都实现了空接口 --> 空接口变量可以存储任意值!

//空接口一般不需要提前定义
type dsoihfiosdfhns interface {
}

//空接口的应用
//1.空接口类型作为函数的参数
//2.空

func main() {
	var x interface{}
	x = "hello"
	fmt.Println(x)
	x = 100
	fmt.Println(x)
	x = true
	fmt.Println(x)
}

Operation results:
hello
100
true

接口底层原理

由于接口类型的值可以是任意一个实现了该接口的类型值,所以接口值除了需要记录具体值之外,还需要记录这个值属于的类型。也就是说接口值由“类型”和“值”组成,鉴于这两部分会根据存入值的不同而发生变化,我们称之为接口的动态类型动态值
在这里插入图片描述

类型断言

简单使用

判断这个接口的值到底是什么类型的,相当于在猜这个接口什么类型。

package main

import "fmt"

func main() {
	var x interface{}
	x = true

	ret := x.(bool)
	fmt.Println("猜对了", ret)
	nret := x.(int)
	fmt.Println("猜错了", nret)

}

Operation results:
猜对了 true
panic: interface conversion: interface {} is bool, not int

goroutine 1 [running]:
main.main()
D:/GoProject/interface.go:32 +0x9f
exit status 2

断言状态判断

如果按上例那样,会导致程序退出,断言可返回一个布尔类型状态,猜对了为true,猜错了false

package main

import "fmt"

func main() {
	var x interface{}
	x = true

	ret, Rstate := x.(bool)
	if Rstate == true {
		fmt.Println("猜对了,值为", ret)
	} else {
		fmt.Println("猜错了")
	}

}

Operation results:
猜对了,值为 true

断言配合switch

package main

import "fmt"

func main() {
	var x interface{}
	x = 100

	switch v := x.(type) {
	case string:
		fmt.Println("该接口为string类型值为", v)
	case bool:
		fmt.Println("该接口为bool类型值为", v)
	case int:
		fmt.Println("该接口为int类型值为", v)
	}

}

Operation results:
该接口为int类型值为 100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小阿大:)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值