Go语言深入学习面向对象

目录匿名字段接口匿名字段go支持只提供类型而不写字段名的方式,也就是匿名字段,也称为嵌入字段packagemainimport"fmt"//人typePersonstruct{namestringsexstringagein

目录


匿名字段

go支持只提供类型而不写字段名的方式,也就是匿名字段,也称为嵌入字段

package main

import "fmt"

//人
type Person struct {
    name string
    sex  string
    age  int
}

// 自定义类型
type mystr string

type Student struct {
    Person
    id   int
    addr string
    //同名字段
    name string
}

// 学生
type Student2 struct {
    Person
    int
    mystr
}

func main() {
  // 初始化
  s1 := Student{Person{"5lmh", "man", 20}, 1, "bj"}
  fmt.Println(s1)

  s2 := Student{Person: Person{"5lmh", "man", 20}}
  fmt.Println(s2)

  var s Student
  // 给自己字段赋值了
  s.name = "5lmh"
  fmt.Println(s)

  // 若给父类同名字段赋值,如下
  s.Person.name = "枯藤"
    fmt.Print

指针类型匿名字段

package main
import "fmt"

//人
type Person struct {
  name string
  sex  string
  age  int
}

// 学生
type Student struct {
  *Person
  id   int
  addr string
}

func main() {
  s1 := Student{&Person{"5lmh", "man", 18}, 1, "bj"}
  fmt.Println(s1)
  fmt.Println(s1.name)
  fmt.Println(s1.Person.name)
}

接口

接口类型

在Go语言中接口(interface)是一种类型,一种抽象的类型。

interface是一组method的集合,是duck-type programming的一种体现。接口做的事情就像是定义一个协议(规则),只要一台机器有洗衣服和甩干的功能,我就称它为洗衣机。不关心属性(数据),只关心行为(方法)。

为了保护你的Go语言职业生涯,请牢记接口(interface)是一种类型。

type Cat struct{}
func (c Cat) Say() string { return "喵喵喵" }
type Dog struct{}
func (d Dog) Say() string { return "汪汪汪" }
func main() {
  c := Cat{}
  fmt.Println("猫:", c.Say())
  d := Dog{}
  fmt.Println("狗:", d.Say())
}

接口的定义

Go语言提倡面向接口编程。

  • 接口是一个或多个方法签名的集合。

  • 任何类型的方法集中只要拥有该接口'对应的全部方法'签名。

  • 就表示它 "实现" 了该接口,无须在该类型上显式声明实现了哪个接口。

  • 这称为Structural Typing。

  • 所谓对应方法,是指有相同名称、参数列表 (不包括参数名) 以及返回值。

  • 当然,该类型还可以有其他方法。

  • 接口只有方法声明,没有实现,没有数据字段。

  • 接口可以匿名嵌入其他接口,或嵌入到结构中。

  • 对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,既无法修改复制品的状态,也无法获取指针。

  • 只有当接口存储的类型和对象都为nil时,接口才等于nil。

  • 接口调用不会做receiver的自动转换。

  • 接口同样支持匿名字段方法。

  • 接口也可实现类似OOP中的多态。...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论