golang基础-接口、接口嵌套、类型断言、接口与结构体_接口等转换
来源:互联网 发布:mysql大神博客 编辑:程序博客网 时间:2024/05/21 09:44
接口
package mainimport "fmt"type Test interface { Print() Sleep()}type Student struct { name string age int score int}/*student实现接口Print方法*/func (p Student) Print() { fmt.Println("name:", p.name) fmt.Println("age:", p.age) fmt.Println("score:", p.score)}/*student实现接口Sleep方法*/func (p Student) Sleep() { fmt.Println("student sleep")}func main() { var t Test fmt.Println(t) fmt.Println("--------------------") var stu Student = Student{ name: "stu1", age: 20, score: 200, } //使用接口方法 t = stu t.Print() t.Sleep() fmt.Println("=============") fmt.Println("t:", t)}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go<nil>--------------------name: stu1age: 20score: 200student sleep=============t: {stu1 20 200}PS E:\golang\go_pro\src\safly>
或者如下的代码也可以:
package mainimport "fmt"type Test interface { Print() Sleep()}type Student struct { name string age int score int}/*student实现接口Print方法*/func (p *Student) Print() { fmt.Println("name:", (*p).name) fmt.Println("age:", (*p).age) fmt.Println("score:", (*p).score)}/*student实现接口Sleep方法*/func (p *Student) Sleep() { fmt.Println("student sleep")}func main() { var t Test fmt.Println(t) fmt.Println("--------------------") var stu *Student = &Student{ name: "stu1", age: 20, score: 200, } //使用接口方法 t = stu t.Print() t.Sleep() fmt.Println("=============") fmt.Println("t:", t)}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go<nil>--------------------name: stu1age: 20score: 200student sleep=============t: &{stu1 20 200}PS E:\golang\go_pro\src\safly>
sort接口实现
一种事物的多种形态,都可以按照统一的接口进行操作
我们来做一个例子,通过实现sort接口,来对切片实现排序
package mainimport ( "fmt" "math/rand" "sort")type Student struct { Name string Id string Age int sortType int}type Book struct { Name string Author string}//别名type StudentArray []Studentfunc (p StudentArray) Len() int { return len(p)}func (p StudentArray) Less(i, j int) bool { return p[i].Name < p[j].Name}func (p StudentArray) Swap(i, j int) { p[i], p[j] = p[j], p[i]}func main() { var stus StudentArray for i := 0; i < 10; i++ { stu := Student{ Name: fmt.Sprintf("stu%d", rand.Intn(100)), Id: fmt.Sprintf("110%d", rand.Int()), Age: rand.Intn(100), } stus = append(stus, stu) } for _, v := range stus { fmt.Println(v) } fmt.Println("\n\n") sort.Sort(stus) for _, v := range stus { fmt.Println(v) }}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go{stu81 1108674665223082153551 47 0}{stu59 1103916589616287113937 18 0}{stu25 1101443635317331776148 56 0}{stu0 1104751997750760398084 11 0}{stu62 1103510942875414458836 28 0}{stu74 1102610529275472644968 45 0}{stu37 1102015796113853353331 95 0}{stu66 1105263531936693774911 58 0}{stu47 1102740103009342231109 87 0}{stu88 1107981306761429961588 15 0}{stu0 1104751997750760398084 11 0}{stu25 1101443635317331776148 56 0}{stu37 1102015796113853353331 95 0}{stu47 1102740103009342231109 87 0}{stu59 1103916589616287113937 18 0}{stu62 1103510942875414458836 28 0}{stu66 1105263531936693774911 58 0}{stu74 1102610529275472644968 45 0}{stu81 1108674665223082153551 47 0}{stu88 1107981306761429961588 15 0}PS E:\golang\go_pro\src\safly>
接口嵌套
package mainimport "fmt"type Reader interface { Read()}type Writer interface { Write()}type ReadWriter interface { Reader Writer}type File struct {}func (f *File) Read() { fmt.Println("read data")}func (f *File) Write() { fmt.Println("write data")}//类似java里面的多态func TestReader(r Reader) { r.Read()}//测试接口嵌套func Test(rw ReadWriter) { rw.Read() rw.Write()}func main() { var f File //多态 TestReader(&f) //嵌套接口 Test(&f)}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.goread dataread datawrite dataPS E:\golang\go_pro\src\safly>
类型断言
类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型
接口.()转换方式
package mainimport "fmt"func main() { var i int var inter interface{} inter = i a:=inter.(int) fmt.Printf("%d,%T\n",a,a) fmt.Printf("%d,%T\n",inter,inter)}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go0,int0,intPS E:\golang\go_pro\src\safly>
或者如下更简单方式
package mainimport "fmt"func Test(a interface{}){ fmt.Printf("%d,%T\n",a,a)}func main() { var b int Test(b)}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go0,intPS E:\golang\go_pro\src\safly>
结构体转为接口
package mainimport "fmt"type Stu struct{ Name string Sex string}func Test(a interface{}){ b,ok := a.(Stu) if ok == false{ fmt.Println("convert failed") return } b.Name = "safly" fmt.Println(b)}func main() { var b Stu Test(b)}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go{safly }PS E:\golang\go_pro\src\safly>
结构体指针转为接口
package mainimport "fmt"type Student struct { Name string Sex string}func Test(a interface{}) { b, ok := a.(*Student) if ok == false { fmt.Println("convert failed") return } fmt.Println(*b)}func main() { var b Student = Student{ Name: "stu01", Sex: "female", } Test(&b)}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go{stu01 female}PS E:\golang\go_pro\src\safly>
接口转为接口
package mainimport "fmt"type Reader interface { Read()}type Writer interface { Write()}type ReadWriter interface { Reader Writer}type File struct {}func (f *File) Read() { fmt.Println("read data")}func (f *File) Write() { fmt.Println("write data")}func Test(rw ReadWriter) { rw.Read() rw.Write()}func main() { var f *File var b interface{} b = f //结构体指针 c:=b.(*File) c.Read() //接口赋值接口 oo := b.(Reader) oo.Read() //接口赋值接口 v := b.(ReadWriter) v.Read()}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.goread dataread dataread dataPS E:\golang\go_pro\src\safly>
switch x.(type) 转换方式
package mainimport "fmt"type Student struct { Name string Sex string}func just(items ...interface{}) { for index, v := range items { switch v.(type) { case bool: fmt.Printf("%d params is bool, value is %v\n", index, v) case int, int64, int32: fmt.Printf("%d params is int, value is %v\n", index, v) case float32, float64: fmt.Printf("%d params is float, value is %v\n", index, v) case string: fmt.Printf("%d params is string, value is %v\n", index, v) case Student: fmt.Printf("%d params student, value is %v\n", index, v) case *Student: fmt.Printf("%d params *student, value is %v\n", index, v) } }}func main() { var b Student = Student{ Name: "stu01", Sex: "female", } just(28, 8.2, "this is a test", b, &b)}
输出如下:
PS E:\golang\go_pro\src\safly> go run demo.go0 params is int, value is 281 params is float, value is 8.22 params is string, value is this is a test3 params student, value is {stu01 female}4 params *student, value is &{stu01 female}PS E:\golang\go_pro\src\safly>
阅读全文
0 0
- golang基础-接口、接口嵌套、类型断言、接口与结构体_接口等转换
- golang 接口interface{}、断言、switch type
- golang接口
- golang 接口
- golang 接口
- golang积累-接口指针与结构体指针
- golang积累-接口指针与结构体指针
- golang中的类型和接口
- 嵌套接口-接口
- Java基础_接口
- java基础_接口
- 嵌套接口
- golang 接口嵌套实现复用
- java之类型转换与接口
- java:14-类型转换与接口
- 接口(六)接口转换
- 接口与类型信息
- 接口
- shell用法总结
- 使用openssl API编写client和server
- linux 查看硬盘序列号
- circualArray
- nodejs -- 使用rabbitMq
- golang基础-接口、接口嵌套、类型断言、接口与结构体_接口等转换
- Mac ssh 多账号登陆管理
- 【ML】机器学习学前准备
- 解决Maven Configuration Problem问题
- Servlet生命周期与工作原理
- Angular4-在线竞拍应用-开发环境的搭建
- JAVA学习笔记-06
- 安卓开发安全问题
- 方法参数