package mainimport "fmt"//接口是一个规范type Usber interface {start()stop()}//如果接口里面有方法的话,必要要通过结构体或者通过自定义类型实现这个接口type Phone struct {Name string}//手机要实现usb接口的话必须得实现usb接口中的所有方法func (p Phone) start() {fmt.Println(p.Name, "启动")}func (p Phone) stop() {fmt.Println(p.Name, "关机")}type Camera struct {}func (p Camera) start() {fmt.Println("相机启动")}func (p Camera) stop() {fmt.Println("相机关机")}func (p Camera) run() {fmt.Println("run")}func main() {p := Phone{Name: "华为手机",}// p.start1()var p1 Usber //golang中接口就是一个数据类型p1 = p //表示手机实现Usb接口p1.stop()c := Camera{}var c1 Usber = c //表示相机实现了Usb接口c1.start()// c1.run() //错误:type Usber has no field or method run)c.run() //run}
package mainimport "fmt"type Usber interface {start()stop()}//电脑type Computer struct {}// var usb Usber =camerafunc (c Computer) work(usb Usber) {usb.start()usb.stop()}//手机type Phone struct {Name string}func (p Phone) start() {fmt.Println(p.Name, "启动")}func (p Phone) stop() {fmt.Println(p.Name, "关机")}//照相机type Camera struct {}func (p Camera) start() {fmt.Println("相机启动")}func (p Camera) stop() {fmt.Println("相机关机")}func main() {var computer = Computer{}var phone = Phone{Name: "小米",}var camera = Camera{}computer.work(phone)computer.work(camera)}
package mainimport "fmt"type A interface{} //空接口 表示没有任何约束 任意的类型都可以实现空接口func main() {var a Avar str = "你好golang"a = str //让字符串实现A这个接口fmt.Printf("值:%v 类型:%T\n", a, a) //值:你好golang 类型:stringvar num = 20a = num //表示让int类型实现A这个接口fmt.Printf("值:%v 类型:%T\n", a, a)var flag = truea = flag //表示让bool类型实现A这个接口fmt.Printf("值:%v 类型:%T", a, a)}
package mainimport "fmt"//golang中空接口也可以直接当做类型来使用,可以表示任意类型//空接口作为函数的参数func show(a interface{}) {fmt.Printf("值:%v 类型:%T\n", a, a)}func main() {// var a interface{}// a = 20// fmt.Printf("值:%v 类型:%T\n", a, a)// a = "你好golang"// fmt.Printf("值:%v 类型:%T\n", a, a)// a = true// fmt.Printf("值:%v 类型:%T\n", a, a)// show(20)// show("你好golang")// slice := []int{1, 2, 34, 4}// show(slice)// var m1 = make(map[string]string)// m1["username"] = "张三"// m1["age"] = "20"// fmt.Println(m1)// var m1 = make(map[string]interface{})// m1["username"] = "张三"// m1["age"] = 20// m1["married"] = true// fmt.Println(m1)var s1 = []interface{}{1, 2, "你好", true} //[1 2 你好 true]fmt.Println(s1)}
package mainimport "fmt"//定义一个方法,可以传入任意数据类型,然后根据不同的类型实现不同的功能func MyPrint1(x interface{}) {if _, ok := x.(string); ok {fmt.Println("string类型")} else if _, ok := x.(int); ok {fmt.Println("int类型")} else if _, ok := x.(bool); ok {fmt.Println("bool类型")}}//x.(type) 判断一个变量的类型 这个语句只能用在switch语句里面func MyPrint2(x interface{}) {switch x.(type) {case int:fmt.Println("int类型")case string:fmt.Println("string类型")case bool:fmt.Println("bool类型")default:fmt.Println("传入错误...")}}//类型断言func main() {// var a interface{}// a = "你好golang"// v, ok := a.(string)// if ok {// fmt.Println("a就是一个string类型,值是:", v)// } else {// fmt.Println("断言失败")// }// MyPrint1("你好golang")// MyPrint1(true)MyPrint2("你好golang")MyPrint2(true)}
package mainimport "fmt"type Usber interface {start()stop()}//电脑type Computer struct {}func (c Computer) work(usb Usber) {//要判断usb的类型if _, ok := usb.(Phone); ok { //类型断言usb.start()} else {usb.stop()}}//手机type Phone struct {Name string}func (p Phone) start() {fmt.Println(p.Name, "启动")}func (p Phone) stop() {fmt.Println(p.Name, "关机")}//照相机type Camera struct {}func (p Camera) start() {fmt.Println("相机启动")}func (p Camera) stop() {fmt.Println("相机关机")}func main() {var computer = Computer{}var phone = Phone{Name: "小米手机",}var camera = Camera{}computer.work(phone)computer.work(camera)}
package mainimport "fmt"/*结构体值接收者实现接口:值接收者: 如果结构体中的方法是值接收者,那么实例化后的结构体值类型和结构体指针类型都可以赋值给接口变量*/type Usber interface {start()stop()}type Phone struct {Name string}func (p Phone) start() { //值接收者fmt.Println(p.Name, "启动")}func (p Phone) stop() {fmt.Println(p.Name, "关机")}func main() {// 结构体值接收者例化后的结构体值类型和结构体指针类型都可以赋值给接口变量var p1 = Phone{Name: "小米手机",}var p2 Usber = p1 //表示让Phone实现Usb的接口p2.start()var p3 = &Phone{Name: "苹果手机",}var p4 Usber = p3 //表示让Phone实现Usb的接口p4.start()}
package mainimport "fmt"/*结构体指针接收者实现接口:指针接收者: 如果结构体中的方法是指针接收者,那么实例化后结构体指针类型都可以赋值给接口变量, 结构体值类型没法赋值给接口变量。*/type Usber interface {start()stop()}type Phone struct {Name string}func (p *Phone) start() { //指针接收者fmt.Println(p.Name, "启动")}func (p *Phone) stop() {fmt.Println(p.Name, "关机")}func main() {/*错误写法var phone1 = Phone{Name: "小米",}var p1 Usber = phone1 // Phone does not implement Usber (start method has pointer receiverp1.start()*/var phone1 = &Phone{Name: "小米",}var p1 Usber = phone1p1.start()}
package mainimport "fmt"//定义一个Animal的接口,Animal中定义两个方法,分别是SetName和GetName。分别让Dog结构体和Cat结构体实现这个方法type Animaler interface {SetName(string)GetName() string}type Dog struct {Name string}func (d *Dog) SetName(name string) {d.Name = name}func (d Dog) GetName() string {return d.Name}type Cat struct {Name string}func (c *Cat) SetName(name string) {c.Name = name}func (c Cat) GetName() string {return c.Name}func main() {//Dog实现Animal的接口d := &Dog{Name: "小黑",}var d1 Animaler = dfmt.Println(d1.GetName())d1.SetName("阿奇")fmt.Println(d1.GetName())//Cat实现Animal的接口c := &Cat{Name: "小花",}var c1 Animaler = cfmt.Println(c1.GetName())}
package mainimport "fmt"//一个结构体实现多个接口type Animaler1 interface {SetName(string)}type Animaler2 interface {GetName() string}type Dog struct {Name string}func (d *Dog) SetName(name string) {d.Name = name}func (d Dog) GetName() string {return d.Name}func main() {//Dog实现Animal的接口d := &Dog{Name: "小黑",}var d1 Animaler1 = d //表示让Dog实现Animaler1这个接口var d2 Animaler2 = d //表示让Dog实现Animaler2这个接口d1.SetName("小花狗狗")fmt.Println(d2.GetName()) //小花狗狗}
package mainimport "fmt"//接口嵌套type Ainterface interface {SetName(string)}type Binterface interface {GetName() string}type Animaler interface { //接口的嵌套AinterfaceBinterface}type Dog struct {Name string}func (d *Dog) SetName(name string) {d.Name = name}func (d Dog) GetName() string {return d.Name}func main() {//Dog实现Animal的接口d := &Dog{Name: "小黑",}var d1 Animaler = d //表示让Dog实现Animaler这个接口d1.SetName("小花狗狗")fmt.Println(d1.GetName()) //小花狗狗}
package mainimport "fmt"type Address struct {Name stringPhone int}// Golang中空接口和类型断言使用细节func main() {var userinfo = make(map[string]interface{})userinfo["username"] = "张三"userinfo["age"] = 20userinfo["hobby"] = []string{"睡觉", "吃饭"}fmt.Println(userinfo["age"])fmt.Println(userinfo["hobby"])// fmt.Println(userinfo["hobby"][1]) //interface {} does not support indexingvar address = Address{Name: "李四",Phone: 1521242141,}fmt.Println(address.Name) //李四userinfo["address"] = addressfmt.Println(userinfo["address"]) //{李四 1521242141}// var name = userinfo["address"].Name //type interface {} is interface with no methods// fmt.Println(name)hobby2, _ := userinfo["hobby"].([]string)fmt.Println(hobby2[1]) //吃饭address2, _ := userinfo["address"].(Address)fmt.Println(address2.Name, address2.Phone) //李四 1521242141}
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论