学生管理系统 网站开发,南宁网站设计公司排名,财务记账网站建设需要摊销吗,大兴模版网站建设哪家好一、GoLang 接口的定义
1、GoLang 中的接口
在 Go 语言中接口#xff08;interface#xff09;是一种类型#xff0c;一种抽象的类型接口#xff08;interface#xff09;定义了一个对象的行为规范#xff0c;只定义规范不实现#xff0c;由具体的对象来实现规范的细节…一、GoLang 接口的定义
1、GoLang 中的接口
在 Go 语言中接口interface是一种类型一种抽象的类型接口interface定义了一个对象的行为规范只定义规范不实现由具体的对象来实现规范的细节实现接口的条件 一个对象只要全部实现了接口中的方法那么就实现了这个接口换句话说接口就是一个需要实现的方法列表
2、定义一个 Usber 接口
定义了一个 Usber 接口让 Phone 和 Camera 结构体实现这个接口
package mainimport fmt//1、接口是一个规范
type Usber interface {start()stop()
}//2.如果接口里面有方法的话必要通过结构体或通过自定义类型实现这个接口
type Phone struct{Name string
}//3.手机摇实现 usb 接口的话必须先实现 usb 接口中的所有方法
func (p Phone) start() {fmt.PrintIn(p.Name,启动)
}
func (p Phone) stop() {fmt.PrintfIn(p.Name,关机)
}func main() {p : Phone{Name : 华为手机}var p1 Usber //golang中几口就是一个数据类型p1 pp1.start()p1.stop()
}
/*
华为手机 启动
华为手机 关机*/
二、空接口
1、空接口说明
golang 中空接口也可以之间当做类型来使用可以表示任意类型Golang 中的接口可以不定义任何方法没有定义任何方法的接口就是空接口空接口表示没有任何约束因此任何类型变量都可以实现空接口空接口在实际项目中用的是非常多的用空接口可以表示任意类型数据
2、空接口作为函数的参数
package mainimport fmt//空接口作为函数的参数func show (a interface{}){fmt.Printf(值%v,类型%T\n,a,a)
}func main(){show(20) //值20类型intshow(你好 golang) //值您好 golang 类型stringslice : []int{1,2,34,5}show(slice) //值[1 2 34 5] 类型[]int
}
3、切片实现空接口
package mainimport fmtfunc main() {var slice []interface{}{Snail,20,true,32.2}fmt.PrintIn(slice) //[Snail 20 true 32.2]
}
4、map 的值实现空接口
package mainimport fmtfunc main() {//空接口作为 map 值var studentInfo make(map[string]interface{})studentInfo[name] SnailstudentInfo[age] 18studentInfo[married] falsefmt.PrintIn(studentInfo)// [age:18 married:false name:Snail]
}
三、类型断言
一个接口的值简称接口值是由一个具体类型和具体类型的值两部分组成的这两部分分别称为接口的动态类型和动态值如果我们想要判断空接口中值的类型那么这个时候就可以使用类型断言其语法格式x.(T) x:表示类型为 interface{}的变量T表示断言x 可能是的类型
package mainimport fmtfunc main() {var x interface {}x hello golangv,ok :x.(string)if ok {fmt.PrintIn(v)}else {fmt.PrintIn(非字符串类型)}
}
四、值接收者和指针接收者
1、值接收者
如果结构体中的方法是值接收者那么实例化后的结构体值类型和结构体指针类型都可以赋值给接口变量
package mainimport fmttype Usb interface {Start()Stop()
}
type Phone struct {Name string
}
func (p Phone) Start() {fmt.PrintIn(p.Name,开始工作)
}
func (p Phone) Stop() {fmt.Println(phone 停止)
}func main() {phone1 : Phone{Name:华为手机}var p1 Usb phone1 //phone1 实现了 Usb接口 phone1 是 Phone 类型p1.Start()phone2 : Phone{ //华为手机开始工作Name:苹果手机}var p2 Usb phone2 //phone2 实现了 Usb 接口 phone2 是 *Phone 类型p2.Start()
}2、指针接收者
如果结构体中的方法是指针接收者那么实例化后结构体指针类型都可以赋值给接口变量结构体值类型没法赋值给接口变量
package main
import fmt
type Usb interface {Start()Stop()
}
type Phone struct {Name string
}
func (p *Phone) Start() {fmt.Println(p.Name, 开始工作)
}
func (p *Phone) Stop() {fmt.Println(phone 停止)
}
func main() {/*错误写法phone1 : Phone{Name: 小米手机,}var p1 Usb phone1p1.Start()*///正确写法phone2 : Phone{Name: 苹果手机,}var p2 Usb phone2 //phone2 实现了 Usb 接口 phone2 是 *Phone 类型p2.Start()//苹果手机 开始工作
}
五、一个结构体实现多个接口
Golang 中一个结构体也可以实现多个接口
package mainimport fmttype AInterface interface {GetInfo() string
}
type Binterface interface {SetInfo(string,int)
}
type People struct{Name stringAge int
}func (p People) GetInfo() string(){return fmt.Sprintf(姓名%v 年龄%d,p.Name,p.Age)
}func (p *People) SetInfo(name string, age int) {p.Name namep.Age age
}func main() {ver people People{Name:Snail,Age: 20,}// people实现了 Ainterface 和 Binterfacevar p1 AInterface peoplevar p2 Binterface peoplefmt.PrintIn(p1.GetInfo()) //姓名Snail 年龄20p2.SetInfo(pupu,21)fmt.PrintIn(p1.GEtInfo) //姓名pupu 年龄21
}
六、接口嵌套
接口与接口间可以通过嵌套创造出新的接口
package main import fmttype SayInterface interface {say()
}type MoveInterface interface {move()
}//接口嵌套
type Animal interface {SayInterfaceMoveInterface
}
type Cat struct {name string
}
func (c Cat) say() {fmt.PrintIn(喵喵喵)
}
func (c Cat) move(){fmt.PrintIn(猫会动)
}
func main() {var x Animalx Cat{name: 花花}x.move() // 猫会动x.say() // 喵喵喵
}