教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 golang 结构体断言_Golang的面向对象编程【结构体、方法、继承、接口】-Go语言中文社区...

golang 结构体断言_Golang的面向对象编程【结构体、方法、继承、接口】-Go语言中文社区...

发布时间:2021-12-10   编辑:jiaochengji.com
教程集为您提供golang 结构体断言,Golang的面向对象编程【结构体、方法、继承、接口】-Go语言中文社区...等资源,欢迎您收藏本站,我们将为您提供最新的golang 结构体断言,Golang的面向对象编程【结构体、方法、继承、接口】-Go语言中文社区...资源

Golang也支持面向对象编程。但与以前学过传统的面向对象编程语言有区别。

1)Golang没有类class,Go语言的结构体struct和类class有相似的特性。

2)Golang中不存在继承,方法重载,构造函数,析构函数,隐藏和this指针。

3)Golang有继承,封装,多态的特性,但是实现方法与传统OOP语言不同。

1. 结构体struct

type 标识符 struct{

…field type

}

type Student struct {

…Name string // 字段 属性

…Age int

…Score float32

}

结构体的字段类型可以是:基本类型、数组、引用类型。在创建一个结构体变量时,如果没有进行字段赋值,则对应一个默认值。

其中,指针、slice、map的默认值是nil,没有分配空间,所以如果要使用,需要先进行make。

1.1 结构体实例内存布局

注意:结构体类型属于值类型。

1.2 结构体实例化

type Student struct {

…Name string // 字段 属性

…Age int

…Score float32

}

1)直接声明

var s1 Student

2)结构体{}

var s2 Student = Student{ “tom” ,12, 98}

// s2 = Student{ “tom” ,12, 98}

3)new函数

var s3 *Student = new(Student)

4)引用地址

var s4 *Student = &Student{ }

// var s4 *Student = &Student{“marry”, 27 ,88}

1.3 结构体使用注意事项

1)结构体中的所有字段在内存中连续的。

2)结构体是用户自定义类型,若要进行类型转换,需要具有相同的字段,包括名字,个数和类型。

3)结构体进行type重新定义,相当于取别名。两个类型是不相同的数据类型,不能直接赋值,可以通过强制类型转换。

4)在结构体每个字段是可以写tag。该 可以通过反射机制获取,常见的使用场景就是序列化与反序列化。

在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容。形如

type User struct {

UserId int json:"user_id" bson:"user_id"

UserName string json:"user_name" bson:"user_name"

}

2. 方法

相当于其他OOP语言的类的类函数,在Golang中,方法是作用于指定的数据类型上。自定义类型和基本类型都可以有方法。

func (recevier type) mathodName (参数列表) (返回值列表){

…方法体

…return 返回值

}

type A struct{

…Num int

}

//定义了一个结构体A的方法

func(a A)test(){

…fmt.Println(a.Num)

}

方法的注意事项和细节

1)结构体类型是值类型,在方法调用中,也遵守值拷贝传递参数。

2)如果需要修改结构体变量,可以通过结构体指针的方式来进行参数传递。

3)Golang中方法的作用不仅是结构体的自定义类型,基本数据类型也可以有自己的方法。

4)方法的访问也有类似于字段的权限,即方法名首字母小写,就只能在本包中访问,首字母大写,就可以导出在其他包中调用。

5)如果一个类型实现了String()犯法,那么对于fmt.Println()函数默认会调用这个变量的String()进行输出。

3. Golang的三大特性:封装、继承、多态

3.1 封装

封装就是把抽象的字段和对字段的操作封装在一起,数据被保护在内部,程序的其他包只有通过被授权的操作方法,才能对字段进行操作。

在Golang中封装的实现比较简单

1)将结构体、字段的首字母小写。

2)给结构体提供一个工厂模式的函数(类似于构造函数),首字母大写,可被访问。

3)提供一个Set() 函数方法,对字段进行修改。

4)提供一个Get() 函数方法,用于获取字段。

3.2 继承

type Goods struct{

…Name string

…Price int

}

type Book struct{

…Goods //继承–嵌套匿名结构体

…Writer string

}

注意:

1)结构体可以使用嵌套匿名结构体的所有字段和方法。

2)当结构体与匿名结构体有相同字段或者方法时,编译器会采用就近访问原则。

3)当结构体中有多个匿名结构体,且匿名结构体具有相同的字段和方法时,必须指定匿名结构体名字,否则编译会报错。

4)如果结构体中嵌套有名的结构体变量,这种模式是组合。访问字段和方法时,必须使用嵌套结构体名。

type Book struct{

…g Goods //组合–嵌套有名结构体

…Writer string

}

5)嵌套结构体之后,在创建变量时,可以直接指定匿名结构体字段的值。

b Book{

…Goods{ “1Q84” , 103},

…Wtiter : 东野圭吾,

}

多继承

一个结构体嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的字段 和方法,从而实现了多重继承。

3.3 多态

多态是通过接口来实现的。

3.3.1 接口

简单的接口模拟:

Phone,Camera实现了Usb接口的方法,所以phone,Camera就实现了接口的方法。

基本语法

interface类型定义一组方法啊,但不需要实现,而且interface中不能包含任何变量。type 接口名 intrface {

…方法名1(参数列表)(返回值列表)

…方法名2(参数列表)(返回值列表)

}

接口中的所有方法都没有方法体。

接口的实现

自定义类型实现接口,需要实现接口中声明的所有方法。

注意事项与细节

1)接口不能实例化(类似于C 中的抽象类),可以指向一个实现了该接口的自定义类型的变量。

2)只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型。

3)一个自定义类型可以实现多个接口。

4)接口之间可以实现继承,利用嵌套匿名接口。此时,自定义类型要实现该接口,必须实现该接口所继承的的接口的方法和自己的方法。即A接口继承B,C接口,则自定义类型需要实现A,B,C三个接口的所有方法。

5)interface类型默认是一个指针(引用类型),如果没有对interface初始化,则其为nil。

6)空接口type T interface{}没有任何方法,所有的类型都实现了该空接口,也就可以将任何变量赋给空接口。

接口与继承间的区别:

1)继承的价值在于解决代码的复用性和可维护性;接口的价值在于设计出各规范,让自定义类型去实现。

2)接口比继承更加灵活,接口是like-a的关系,继承是is-a的关系。

3)接口在一定程度上实现代码的解耦。

3.3.2 多态

接口可以体现多态的特征。

1)多态参数

2)多态数组

4. 类型断言

由于接口是一般类型,不知道具体的数据类型,如果需要转成具体类型,就需要使用类型断言,如下:

1)在进行类型断言时,如果类型不匹配,就会崩溃panic,所以在使用的时候确保原来的空接口就是要转的数据类型。

2)进行断言时带检查机制,如果成功就ok,如果失败不要崩溃报panic。

到此这篇关于“golang 结构体断言_Golang的面向对象编程【结构体、方法、继承、接口】-Go语言中文社区...”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang 结构体断言_Golang的面向对象编程【结构体、方法、继承、接口】-Go语言中文社区...
Go核心编程-面向对象 [OOP]
Go语言编程之面向“对象”编程篇
【Go语言入门系列】(八)Go语言是不是面向对象语言?
golang 接口_Golang之接口
Go 语言设计模式系列之一 ——Go 语言中的面向对象
go语言使用之接口与继承的区别
Go语言基础之接口(面向对象编程下)
基于类型系统的面向对象编程语言Go
Golang接口 interface 和结构体struct

[关闭]
~ ~