Golang编程:深入理解结构体及其方法

发表时间: 2022-12-25 09:26

结构体

结构体

将一个或多个变量组合到一起,形成新的类型,这个类型就是结构体。Go语言中的结构体和C++结构体有点类型,而Java和C#中类本质就是结构体。结构体是值类型。

结构体可以定义在函数内部或函数外部,影响的是访问范围, 结构体定义在函数外部,名称首字母是否大写影响到结构体是否能挎包访问,结构体能挎包访问,属于首字母是否大写影响到属性是否挎包访问。

由于结构体是值类型,声明后就会开辟内存空间,所有成员都有对应的初始值,可以直接给结构体多个属性赋值。

结构体指针

结构体是值类型,在方法传递时希望传递结构体地址,可以使用结构体指针完成。

结构体方法

方法和函数语法比较相像,区别是函数属于包,通过包调用函数,而方法属于结构体,通过结构体变量调用。

案例

package mainimport "fmt"type User struct {	Name string	Age  int}func (p User) run() {	fmt.Println("run() ", p)}func (p *User) run2() {	fmt.Println("run2() ", p)}func main() {	// 声明	var u1 User	fmt.Println(u1)	fmt.Printf("%p\n", &u1)	u1.Name = "宋公明"	u1.Age = 78	fmt.Println(u1)	// 给结构体多个属性赋值	var u2 User = User{"宋公明", 78}	fmt.Println(u2)	var u3 User = User{Name: "宋公明", Age: 78}	fmt.Println(u3)	// 判断,值相同就是相等	fmt.Printf("%p-----%p-----%p\n", &u1, &u2, &u3)	fmt.Println(u1 == u2) // true	fmt.Println(u1 == u3) // true	fmt.Println(u2 == u3) // true	// 结构体指针	u4 := new(User)	fmt.Println(u4)        // &{ 0}	fmt.Println(u4 == nil) //false	fmt.Println(*u4)       // { 0}	u4.Name = "宋公明"	u4.Age = 78	fmt.Println(u4)        // &{宋公明 78}	fmt.Println(u1 == *u4) // true	// 结构体指针	// 结构体指针比较的是地址	var u5 *User	u5 = &User{"宋公明", 78}	fmt.Println(u5)         // &{宋公明 78}	fmt.Println(u4 == u5)   // false	fmt.Println(*u4 == *u5) // true	// 方法	u6 := User{"宋公明", 78}	u6.run()  // run()  {宋公明 78}	u6.run2() // run2()  &{宋公明 78}}

面向对象

面向对象

面向对象和面向过程==>面向对象是一种思想,到目前为止还没有一个非常明确的定义,重点是:重用。

封装

封装主要体现在两个方面,封装数据、封装业务。Go中通过首字母大小写控制访问权限,属性首字母小写提供方法是封装数据最常见的实现方式。封装业务就是根据自己的需求提取代码,使用Go语言标准库中的函数过程就属于封装业务。

案例

package mainimport "fmt"func main() {	// 面向对象,封装	p := People66{}	p.SetName("宋公明")	p.SetAge(78)	fmt.Println(p.GetName())	fmt.Println(p.GetAget())}func (p *People66) GetName() string {	return p.name}func (p *People66) GetAget() int {	return p.age}func (p *People66) SetName(name string) {	p.name = name}func (p *People66) SetAge(age int) {	p.age = age}type People66 struct {	name string	age  int}

继承

继承的实现方式:通过关键字实现。继承的实现方式有,强耦合实现,组合式继承和松耦合方式。

传统面向对象中类与类之间的关系,组合 > 聚合 > 关联 > 依赖

继承:is-a,强耦合性,一般认为类与类之间具有强关系;

实现:like-a,接口和实现类之间的关系;

依赖:use-a,具有偶然性的、临时性的、非常弱的;

关联:has-a,一种依赖关系;

聚合:has-a,整体与部分,拥有的关系;

组合:contains-a,比聚合更强,也称为强聚合。

案例

package mainimport "fmt"type Person struct {	Name string	Age  int}type User struct {	Person	Username string}func main() {	var user User = User{Person{"宋公明", 78}, "song"}	fmt.Println(user)}