设为首页 加入收藏

TOP

Go学习笔记4(一)
2023-09-23 15:44:03 】 浏览:458
Tags:习笔记

十三、对象

9.挎包创建结构体实例

【1】创建不同的包:

image-20230908174309371

【2】student.go:

image-20230908174316139

【3】main.go:

image-20230908174320728

发现:如果结构体首字母大写的话,在其它包下可以访问
但是:如果结构体的首字母小写?

image-20230908174328206

解决:结构体首字母小写,跨包访问没问题:---》工厂模式

image-20230908174332174 image-20230908174336015

10.封装

【1】什么是封装:
封装(encapsulation)就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只有通过被授权的操作方法,才能对字段进行操作。

【2】封装的好处:

  1. 隐藏实现细节
  2. 提可以对数据进行验证,保证安全合理

【3】Golang中如何实现封装:

  1. 建议将结构体、字段(属性)的首字母小写(其它包不能使用,类似private,实际开发不小写也可能,因为封装没有那么严格)
  2. 给结构体所在包提供一个工厂模式的函数,首字母大写(类似一个构造函数)
  3. 提供一个首字母大写的Set方法(类似其它语言的public),用于对属性判断并赋值
    func (var 结构体类型名)SetXxx(参数列表){
    //加入数据验证的业务逻辑
    var.Age =参数
    }
  4. 提供一个首字母大写的Get方法(类似其它语言的public),用于获取属性的值
    func (var结构体类型名) GetXxx() (返回值列表){
    return var.字段;
    }
    【4】代码实现:
image-20230908174353631 image-20230908174356625 image-20230908174402616

11.继承

【1】继承的引入:
当多个结构体存在相同的属性(字段)和方法时,可以从这些结构体中抽象出结构体,在该结构体中定义这些相同的属性和方法,其它的结构体不需要重新定义这些属性和方法,只需嵌套一个匿名结构体即可。也就是说:在Golang中,如果一个struct嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承特性。

image-20230908174440091

【2】代码引入:

package main
import (
        "fmt"
)
//定义动物结构体:
type Animal struct{
        Age int
        Weight float32
}
//给Animal绑定方法:喊叫:
func (an *Animal) Shout(){
        fmt.Println("我可以大声喊叫")
}
////给Animal绑定方法:自我展示:
func (an *Animal) ShowInfo(){
        fmt.Printf("动物的年龄是:%v,动物的体重是:%v",an.Age,an.Weight)
}
//定义结构体:Cat
type Cat struct{
        //为了复用性,体现继承思维,嵌入匿名结构体:——》将Animal中的字段和方法都达到复用
        Animal
}
//对Cat绑定特有的方法:
func (c *Cat) scratch(){
        fmt.Println("我是小猫,我可以挠人")
}
func main(){
        //创建Cat结构体示例:
        cat := &Cat{}
        cat.Animal.Age = 3
        cat.Animal.Weight = 10.6
        cat.Animal.Shout()
        cat.Animal.ShowInfo()
        cat.scratch()
}


【3】继承的优点:
提高代码的复用性、扩展性

12.继承的注意事项

【1】结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写或者小写的字段、方法,都可以使用。

 package main
import (
        "fmt"
)
//定义动物结构体:
type Animal struct{
        Age int
        weight float32
}
//给Animal绑定方法:喊叫:
func (an *Animal) Shout(){
        fmt.Println("我可以大声喊叫")
}
////给Animal绑定方法:自我展示:
func (an *Animal) showInfo(){
        fmt.Printf("动物的年龄是:%v,动物的体重是:%v",an.Age,an.weight)
}
//定义结构体:Cat
type Cat struct{
        //为了复用性,体现继承思维,嵌入匿名结构体:——》将Animal中的字段和方法都达到复用
        Animal
}
//对Cat绑定特有的方法:
func (c *Cat) scratch(){
        fmt.Println("我是小猫,我可以挠人")
}
func main(){
        //创建Cat结构体示例:
        cat := &Cat{}
        cat.Animal.Age = 3
        cat.Animal.weight = 10.6
        cat.Animal.Shout()
        cat.Animal.showInfo()
        cat.scratch()
}

【2】匿名结构体字段访问可以简化。

等价于:

image-20230908174532157

cat.Age --->cat对应的结构体中找是否有Age字段,如果有直接使用,如果没有就去找嵌入的结构体类型中的Age
【3】当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近访问原则访问,如希望访问匿名结构体的字段和方法,可以通过匿名结构体名来区分。

package main
import (
        "fmt"
)
//定义动物结构体:
type Animal struct{
        Age int
        weight float32
}
//给Animal绑定方法:喊叫:
func (an *Animal) Shout(){
        fmt.Println("我可以大声喊叫")
}
////给Animal绑定方法:自我展示:
func (an *Animal) showInfo(){
        fmt.Printf("动物的年龄是:%v,动物的体重是:%v",an.Age,an.weight)
}
//定义结构体:Cat
type Cat struct{
        //为了复用性,体现继承思维,嵌入匿名结构体:——》将Animal中的字段和方法都达到复用
        Animal
        Age int
}
func (c *Cat) showInfo(){
        fmt.Printf("~~~~~~~~动物的年龄是:%v,动物的体重是:%v",c.Age,c.weight)
}
//对Cat绑定特有的方法:
func (c *Cat) scratch(){
        fmt.Println("我是小猫,我可以挠人")
}
func main(){
        //创建Cat结构体示例:
        // cat := &Cat{}
        // cat.Age = 3
        // cat.weight = 10.6
        // cat.Shout()
        // cat.showInfo()
        // cat.scratch()
        cat := &Cat{}
        cat.weight = 9.4
        cat.Age = 10 //就近原则
        cat.Animal.Age = 20
        cat.showInfo()//就近原则
        cat.Animal.showInfo()
}

【4】Golang中支持多继承:如一个结构体嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的字段和方法,从而实现了多重继承。为了保证代码的简

首页 上一页 1 2 3 4 5 6 下一页 尾页 1/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇没有了 下一篇Go类型全解:常量与变量大全!

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目