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面向对象编程—结构体的主要内容,如果未能解决你的问题,请参考以下文章

[Golang]面向对象营养餐,一文管够(封装,继承,多态)

Golang 面向对象编程

Golang-struct

Golang学习+深入-面向“对象“编程

Golang-面向对象编程三大特性-继承多重继承

Golang 面向对象编程