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
原创不易,希望大家多多支持
如果文章对你有帮助,记得一键三连哦!❤️❤️❤️

猜你喜欢

转载自blog.csdn.net/weixin_44736475/article/details/114162407