Golang面向对象编程—结构体
Posted Casey321
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang面向对象编程—结构体相关的知识,希望对你有一定的参考价值。
Golang面向对象编程
Golang面向对象编程说明
- Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。
- Golang没有类(class),Golang的结构体(struct)和其它编程语言的类有同等的地址,可以理解Golang是基于struct来实现OOP特性的。
- Golang面向对象编程非常简洁,去掉了传统OOP语言的继承、方法重载、构造函数和析构函数、隐藏的this指针等。
- Golang仍有面向对象编程的继承、封装和多态的特性,知识实现的方式和其它OOP语言不一样,比如继承,Golang没有extends关键字,继承是通过匿名字段来实现。
- Golang面向对象(OOP)很优雅,OOP本身就是语言类型系统的一部分,通过接口关联,耦合性低,也非常灵活。Golang中面向接口编程是非常重要的特性。
结构体与结构体变量(实例)
1、关系示意图
说明:
- 将一类事物的特性提取出来(比如猫类),形成一个新的数据类型,就是一个结构体。
- 通过这个结构体,我们可以创建多个变量(实例/对象)。
- 事物可以是猫类,也可以是Person,Fish等或某个工具类。
2、二者之间的区别和联系
package main
import(
"fmt"
)
type Person struct
Name string
Age int
func main()
//创建一个person变量
var person Person
person.Name = "Casey"
person.Age = 22
fmt.Println("person =",person)
运行结果:
二者之间的区别和联系:
- 结构体是自定义的数据类型,代表一类事物。
- 结构体变量(实例)是具体的,实际的,代表一个具体变量。
结构体变量在内存的布局
package main
import(
"fmt"
)
type Person struct
Name string
Age int
func main()
//创建一个person变量
var person Person
person.Name = "Casey"
person.Age = 22
fmt.Printf("person = %v\\n",person)
fmt.Printf("person.Name的地址为:%v\\n",&person.Name)
fmt.Printf("person.Age的地址为:%v\\n",&person.Age)
运行结果:
如何声明结构体
基本语法:
type 结构体名 struct
field1 type
field2 type
例:
type Student struct
Name string
Age int
Score float32
字段/属性
1、基本介绍
从概念或叫法上看:结构体字段 = 属性 = field。字段式结构体的一个组成部分,一般是基本数据烈性、数组,也可以是引用类型。
2、注意事项
- 字段声明语法同变量。
- 字段的类型可以为:基本类型,数组或引用类型
- 在创建一个结构体变量后,如果没有给字段赋值,都对弈给一个零值(默认值)
- 不同结构体变量的字段是独立的,互不影响,一个结构体变量字段的更改,不影响另外一个,结构体是值类型
package main
import(
"fmt"
)
type Person struct
Name string
Age int
func main()
//创建一个person变量
var person Person
person.Name = "Casey"
person.Age = 22
var person1 = person
person1.Name = "Jerry"
fmt.Printf("person = %v\\n",person)
fmt.Printf("person1 = %v\\n",person1)
运行结果:
结构体初始化
package main
import(
"fmt"
)
type Person struct
Name string
Age int
func main()
//结构体初始化
//方式1
var person Person
person.Name = "Casey"
person.Age = 22
fmt.Printf("person = %v\\n",person)
//方式2,使用键值对初始化
var person1 = Person
Name : "Tom",
Age : 30,
fmt.Printf("person1 = %v\\n",person1)
//方式3
var person2 *Person = new(Person)
(*person2).Name = "Jack"
//说明:go的设计者为了程序员使用方便,底层会对person.Age = 22
//进行处理,会给person2加上取值运算(*person2).Age = 22
person2.Age = 23
fmt.Println("person2 =",*person2)
//方式4
var person3 *Person = &Person
Name : "Danny",
person3.Age = 35
fmt.Println("person3 =",*person3)
运行结果:
说明:
- 第三种和第四种方式返回的是结构体指针。
- 结构体指针访问字段的标准方式应该是:(*结构体名).字段名
- go做了简化,也支持结构体指针.字段名,go编译器底层做了优化。会将 结构体指针.字段名 转成 (*结构体名).字段名。
结构体使用注意事项
- 结构体的所有字段在内存中是连续的。
- 结构体是用户单独定义的类型,和其他类型进行转换要有完全相同的字段(名字,个数和类型)。
package main
import(
"fmt"
)
type A struct
Num int
type B struct
Num int
func main()
var a A
var b B
a = A(b)
fmt.Println(a,b)
运行结果:
- 结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型,但是相互间可以强转。
博主首页链接:https://blog.csdn.net/weixin_44736475
原创不易,希望大家多多支持
如果文章对你有帮助,记得一键三连哦!❤️❤️❤️
以上是关于Golang面向对象编程—结构体的主要内容,如果未能解决你的问题,请参考以下文章