golang结构体、接口的理解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、结构体是什么?
  • 二、结构体的使用
    • 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])

总结

提示:这里对文章进行总结:今天主要总结了一下结构体与接口的理解,使用场景。

你可能感兴趣的:(golang,go)