go语言面向对象特征 | 青训营

107 阅读3分钟

继承

结构体

类似于java中的类class

在面向对象编程中,我们定义类(class)来描述具有相似属性和行为的对象。然后创建该类的实例,即对象。在Go语言中,我们使用结构体来定义类,并通过结构体的方法来实现对象的行为。

如果说类的属性首字母大写, 表示该属性是对外能够访问的,否则的话只能够类的内部访问

//如果类名首字母大写,表示其他包也能够访问
type Hello struct {
	Name  string
	age   int
}

this关键字

与java中的基本相同

父类

子类可以重写父类的方法,也可以调用父类的方法和自己的方法

java中是extend 父类;go中在结构体里声明就行了

type Teacher struct {
    Human//父类
    major string
}

子类

定义子类对象

//s := Teacher{Human{"judy", "female"}, "语文"}
	var s Teacher
	s.name = "judy"
	s.sex = "male"
	s.major = “数学”

多态

接口

接口的定义

接口的本质是指针

type AnimalIF interface {
	Sleep() //睡觉方法
	GetNumber() string //获取动物的数量
}

实现接口

重写全部方法即可实现此接口

var animal AnimalIF //接口的数据类型
animal = &Cat{"3"}
animal.Sleep() //调用Cat的Sleep()方法

空接口interface{}

类似于java的object, 可以⽤interface{}类型 引⽤ 任意的数据类型

所有的基本类型都实现了此接口

类型断言

如果断言失败,那么ok的值将会是false,但是如果断言成功ok的值将会是true,同时value将会得到所期待的正确的值。

str := "hello"
value, ok := str.(string)

反射

变量结构

Golang关于类型设计的一些原则

  • 变量包括(type, value)两部分
  • type 包括 static typeconcrete type. 简单来说 static type是你在编码是看见的类型(如int、string),concrete typeruntime系统看见的类型
  • 类型断言能否成功,取决于变量的concrete type,而不是static type. 因此,一个 reader变量如果它的concrete type也实现了write方法的话,它也可以被类型断言为writer.

在Golang的实现中,每个interface变量都有一个对应pair,pair中记录了实际变量的值和类型:pair(value,type)

value是实际变量值,type是实际变量的类型。一个interface{}类型的变量包含了2个指针,一个指针指向值的类型【对应concrete type】,另外一个指针指向实际的值【对应value】。

-reflect包-

TypeOf & ValueOf

// ValueOf returns a new Value initialized to the concrete value
// stored in the interface i.  ValueOf(nil) returns the zero 
func ValueOf(i interface{}) Value {...}

//ValueOf用来获取输入参数接口中的数据的值,如果接口为空则返回0


// TypeOf returns the reflection Type that represents the dynamic type of i.
// If i is a nil interface value, TypeOf returns nil.
func TypeOf(i interface{}) Type {...}

//TypeOf用来动态获取输入参数接口中的值的类型,如果接口为空则返回nil
  1. reflect.TypeOf: 直接给到了我们想要的type类型,如float64、int、各种pointer、struct 等等真实的类型
  2. reflect.ValueOf:直接给到了我们想要的具体的值,如1.2345这个具体数值,或者类似&{1 "Allen.Wu" 25} 这样的结构体struct的值
  3. 也就是说明反射可以将“接口类型变量”转换为“反射类型对象”,反射类型指的是reflect.Type和reflect.Value这两种

结构体标签

type Movie struct {
	Title  string   `json:"title"`
	Year   int      `json:"year"`
	Price  int      `json:"rmb"`
	Actors []string `json:"actors"`
}

可以通过反射通过key获取value

主要可以用来json格式编码与解码 go

//编码的过程  结构体---> json
	jsonStr, err := json.Marshal(movie)
	if err != nil {
		fmt.Println("json marshal error", err)
		return
	}
//解码的过程 jsonstr ---> 结构体
	myMovie := Movie{}
	err = json.Unmarshal(jsonStr, &myMovie)
	if err != nil {
		fmt.Println("json unmarshal error ", err)
		return
	}