继承
结构体
类似于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 type和concrete type. 简单来说static type是你在编码是看见的类型(如int、string),concrete type是runtime系统看见的类型 - 类型断言能否成功,取决于变量的
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
- reflect.TypeOf: 直接给到了我们想要的type类型,如float64、int、各种pointer、struct 等等真实的类型
- reflect.ValueOf:直接给到了我们想要的具体的值,如1.2345这个具体数值,或者类似&{1 "Allen.Wu" 25} 这样的结构体struct的值
- 也就是说明反射可以将“接口类型变量”转换为“反射类型对象”,反射类型指的是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
}