// (2)指针接收者实现接口 type Runer interface{ run() } type cat struct{} func(c *cat)run() { fmt.Println("指针接收者实现接口 -> 猫...跑....") } // 此时实现run接口的是*cat类型,所以不能给m1传入cat类型的c1,此时x只能存储*dog类型的值。 funcdemo2() { var m1 Runer var c1 = cat{} //m1不可以接收dog类型的变量 // m1 = c1 // 报错信息: cannot use c1 (variable of type cat) as Runer value in assignment: missing method run (run has pointer receiver)compilerInvalidIfaceAssign fmt.Printf("Type : %#v \n", c1)
funcmain() { var peo People = Student{} // 此处为关键点 think := "woman" fmt.Println(peo.Speak(think)) }
答案: 是不行会报 ./interface.go:21:6: cannot use Student{} (type Student) as type People in assignment: Student does not implement People (Speak method has pointer receiver) (exit status 2)错误,由于指针接收者实现接口必须是有指针类型的结构体实例化对象以及其包含的方法。
5.接口与类型
一个类型实现多个接口
描述: 一个结构体类型可以同时实现多个接口,而接口间彼此独立,不知道对方的实现。
例如: 狗可以叫也可以动,我们就分别定义Sayer接口和Mover接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// Sayer 接口 type Sayer interface { say() } // Mover 接口 type Mover interface { move() } // dog既可以实现Sayer接口,也可以实现Mover接口。 type dog struct { name string } // 实现Sayer接口 func(d dog)say() { fmt.Printf("%s会叫 汪汪汪\n", d.name) } // 实现Mover接口 func(d dog)move() { fmt.Printf("%s会动 \n", d.name) }
funcmain() { var a = dog{name: "旺财"} var x Sayer = a // 将dog类型赋予给Sayer接口类型的变量x,此时它可以调用say方法 var y Mover = a // 将dog类型赋予给Mover接口类型的变量y,此时它可以调用move方法 x.say() // 旺财会叫 汪汪汪 y.move() // 旺财会动 }
// Mover 接口 type Mover interface { move() } type dog struct { name string } type car struct { brand string } // dog类型实现Mover接口 func(d dog)move() { fmt.Printf("%s会跑\n", d.name) } // car类型实现Mover接口 func(c car)move() { fmt.Printf("%s速度120迈\n", c.brand) } funcmain() { var x Mover var a = dog{name: "旺财"} x = a x.move() // 旺财会跑 var b = car{brand: "保时捷"} x = b x.move() // 保时捷速度120迈 }
// 示例1.采用if进行判断断言 funcassert(x interface{}) { v, ok := x.(string) // v 接受是string类型 if ok { fmt.Printf("assert successful : %v, typeof %T\n", v, v) } else { fmt.Printf("assert failed 非 string 类型! : %v, typeof %T\n", x, x) } } funcdemo1() { var x interface{} x = "WeiyiGeek" assert(x) // assert successful : WeiyiGeek, typeof string x = 1024 assert(x) // assert failed 非 string 类型! : 1024, typeof int }
// 示例2.如果要断言多次就需要写多个if判断,这个时候我们可以使用switch语句来实现: funcjustifyType(x interface{}) { switch v := x.(type) { casestring: fmt.Printf("x is a string,value is %v\n", v) caseint: fmt.Printf("x is a int is %v\n", v) casebool: fmt.Printf("x is a bool is %v\n", v) default: fmt.Println("unsupport type!") } } funcdemo2() { var x interface{} x = "i'm string" justifyType(x) x = 225 justifyType(x) x = true justifyType(x) }
// 1.首字母小写,外部包不可见,只能在当前包内使用 var a = 100 // 2.首字母大写外部包可见,可在其他包中使用 const Mode = 1
// 3.首字母大写,外部包可见,可在其他包中使用 funcAdd(x, y int)int { return x + y } // 4.首字母小写,外部包不可见,只能在当前包内使用 funcage() { var Age = 18// 函数局部变量,外部包不可见,只能在当前函数内使用 fmt.Println(Age) } // 5.首字母小写,外部包不可见,只能在当前包内使用 type person struct { name string } // 6.结构体中的字段名和接口中的方法名如果首字母都是大写,外部包可以访问这些字段和方法 type Student struct { Name string//可在包外访问的方法 class string//仅限包内访问的字段 } type Payer interface { init() //仅限包内访问的方法 Pay() //可在包外访问的方法 }
This is a package demo 1024 true FLAG => true, Flag => 1024 msg: 我是函数内部的变量 Weiyieek 正在打游戏....
包总结:
1) 我们可以在GOPATH/src路径下按照golang项目工程组织规范进行创建自定义包。
2) 自定义包中需要外部调用访问的(如变量、常量、类型、函数等),必须首字母进行大写。
3) 导入自定义包时我们可以自定义别名,但是需要满足命名规则已经不能与当前目录名称重名。
4) 多个包都定义init()函数时,从调用的最后一包中递归向上执行输出。
错误说明:
Step 1.引入自定义包的时候报 go.mod file not found in current directory or any parent directory 错误.
1 2
go: go.mod file not found in current directory or any parent directory; see 'go help modules' (exit status 1) no required module provides package weiyigeek.top/custom/pkg/demo1; to add it: go get weiyigeek.top/custom/pkg/demo1 (compile)go-staticcheck
问题原因: go的环境设置问题,其次查看GOPATH目录中src为存放第三方go包。 解决办法: go env -w GO111MODULE=auto
Step 2.main redeclared in this block (see details)compiler 错误信息:
1 2
main redeclared in this block (see details)compilerDuplicateDecl 03datatype.go(151, 6): main redeclared in this block
方式1.请访问本博主的B站【WeiyiGeek】首页关注UP主, 将自动随机获取解锁验证码。
Method 2.Please visit 【My Twitter】. There is an article verification code in the homepage.
方式3.扫一扫下方二维码,关注本站官方公众号
回复:验证码
将获取解锁(有效期7天)本站所有技术文章哟!