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>
原创粉丝点击