提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、结构体是什么?
- 二、结构体的使用
- 1.什么情况下需要使用结构体?
- 三.接口是什么?
- 四.接口的使用
- 五、空接口
- 总结
golang中的结构体
golang结构体的使用
golang中的接口
golang接口的使用
前言
提示:这里可以添加本文要记录的大概内容:
学习golang语言时一直不清楚结构体、接口之间的关系,结构体与接口的使用场景。记录一下自己对结构体,接口的自我理解。
提示:以下是本篇文章正文内容,下面案例可供参考
一、结构体是什么?
结构体属于一种数据类型,结构体可以保存int、string、float、bool、结构体等数据类型
go语言中可以自己定义结构体,结构体中存储的值。如果要使用结构体请初始化。
关键字(type 类型名 struct)
代码如下(示例)
type animal struct {}
type person struct {
name string
age int32
animal
}
type dog struct {
name string
feet int
animal
}
二、结构体的使用
1.什么情况下需要使用结构体?
答:当需要保存多个不同类型值时,存储一组数据时使用
例:假如我要用结构体实现一辆汽车,并且实现汽车功能
实现思路:从最基础的零件开始实现(螺丝、螺帽、齿轮)—>将零件组装成汽车的部件(发动机、车轮) —>再将部件组装成为汽车。
三.接口是什么?
go语言中接口是一种类型(interface)能够在函数中作为值传入和返回。接口是定义规则,只要实现了接口中所有的函数就认为实现了接口。例如一个洗衣机接口定义有两个功能wash(),dry()。只要满足这两个功能,不管是什么类型,不管质量如何,都可以认为是一个洗衣机。
type washer struct{}
type dryer struct{}
type washingmachiner interface {
wash()
dry()
}
type haier struct {
name string
washer
dryer
}
func (w washer) wash() {
fmt.Println("洗洗洗....")
}
func (d dryer) dry() {
fmt.Println("甩甩甩....")
}
func main() {
var xiyiji washingmachiner
var Haier haier
Haier.name = "海尔"
xiyiji = Haier
xiyiji.dry()
xiyiji.wash()
}
四.接口的使用
多个种类实现了同一个接口,比如支付宝、微信都实现了payer接口。通过接口使用不同渠道的支付方法。
package main
import "fmt"
//支付宝结构体
type zhifubao struct {
amount float64
}
//微信结构体
type weixin struct {
amount float64
}
//定义的支付接口
type payer interface {
pay(i float64)
}
//实现支付宝付款方法
func (z zhifubao) pay(i float64) {
if z.amount < i {
fmt.Printf("支付失败,金额不足%.2f元\n", i)
} else {
fmt.Printf("扣款成功%.2f\n", (z.amount - i))
}
}
//实现微信付款方法
func (w weixin) pay(i float64) {
if w.amount < i {
fmt.Printf("支付失败,金额不足%.2f\n", i)
} else {
fmt.Printf("扣款成功%.2f\n", (w.amount - i))
}
}
//定义一个使用付款的方法
func makePay(p payer) {
p.pay(1.00)
}
func main() {
var Pay payer
zhifubao := zhifubao{amount: 0.15}
weixin := weixin{amount: 20.00}
Pay = zhifubao
makePay(Pay)
Pay = weixin
makePay(Pay)
}
结果
支付失败,金额不足1.00元
扣款成功19.00
五、空接口
//interface{} 中可以传入任意的类型
var userinfo = make(map[string]interface{})
userinfo["name"] = "罗老师"
userinfo["age"] = 22
userinfo["hobby"] = []string{"睡觉", "吃饭", "打豆豆"}
fmt.Printf("userinfo[\"name\"]: %v\n", userinfo["name"])
fmt.Printf("userinfo[\"age\"]: %v\n", userinfo["age"])
fmt.Printf("userinfo[\"hobby\"]: %v\n", userinfo["hobby"])
fmt.Println(userinfo["hobby"][1])
结果
userinfo["name"]: 罗老师
userinfo["age"]: 22
userinfo["hobby"]: [睡觉 吃饭 打豆豆]
invalid operation: userinfo["hobby"][1] (type interface {} does not support indexing)
如果空接口中传入切片、map、结构体内容,不能直接通过空接口获取其中的值,不支持!!!
解决办法:判断空接口类型,将值返回(切片,map,接口体)项目中经常使用
x.(T) //判断空接口类型
hobby, _ := userinfo["hobby"].([]string)
fmt.Printf("hobby[0]: %v\n", hobby[0])
总结
提示:这里对文章进行总结:今天主要总结了一下结构体与接口的理解,使用场景。