zoukankan      html  css  js  c++  java
  • golang面向对象编程思想

    抽象介绍:

      在定义一个结构体的时候,实际上就是把一类事物的共有属性(字段)和行为(方法) 提取出来,形成一个物理模型(模板),这种研究问题的方法称为抽象。

    封装:

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

      1)将结构体、字段(属性)的首字母小写

      2)给结构体所在包提供一个工厂模式的函数,首字母大写,类似一个构造函数

      3)提供一个首字母大写的Set方法(类似其它语言的public),用于对属性判断并赋值

     model.go

    package model
    
    import (
        "fmt"
    )
    
    type account struct {
        username string
        password string
        balance float64
    }
    
    func NewAccount() *account {
        return &account{}
    }
    
    // 设置账号
    func (user *account) SetUsername(username string) {
        if len(username) < 6 && len(username) > 10 {
            fmt.Println("账号长度必须是6到10位")
            return
        }
        user.username = username
    }
    
    func (user *account) GetUsername() string {
        return user.username
    }
    
    // 设置密码
    func (user *account) SetPassword(password string) {
        if len(password) != 6 {
            fmt.Println("密码必须是6位")
            return
        }
        user.password = password
    }
    
    func (user *account) GetPassword() string {
        return user.password
    }
    
    // 设置余额
    func (user *account) SetBalance(balance float64) {
        if balance < 20 {
            fmt.Println("余额必须大于20")
            return
        }
        user.balance = balance
    }
    
    func (user *account) GetBalance() float64 {
        return user.balance
    }

    main.go

    package main
    
    import (
        "fmt"
        "model"
    )
    
    func main() {
        user := model.NewAccount()
        user.SetUsername("admin123")
        user.SetPassword("123456")
        user.SetBalance(20)
        fmt.Println(user.GetUsername(), user.GetPassword(), user.GetBalance())
    }

    继承:

      在golang中,如果一个struct嵌套了另一个匿名函数体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承特性。

      1)代码的复用性提高了

      2)代码扩展性和维护性提高了

      深入讨论:

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

        2)匿名结构体字段访问可以简化:b.A.hobby()  ==> b.hobby();

        3)当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近访问原则访问,如希望访问匿名结构体和字段和方法,可以通过匿名结构体名来区分;

        4)结构体嵌入两个以上匿名结构体,如两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的字段和方法),在访问时,就必须明确指定匿名结构体名字,否则编译报错;

        5)如果一个struct嵌套了一个有名结构体,这种模式就是组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上结构体的名字;

        6)嵌套匿名函数结构体后,也可以在创建结构体变量时(实例),直接指定各个匿名结构体字段的值;

    接口:

      interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。到某个自定义类型要使用的时候,在根据具体情况把这些方法写出来。

      语法:

        type 接口名 interface {

          method1(参数列表) 返回值列表

          method2(参数列表) 返回值列表  

        }

      注意事项:

        1)接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例);

        2)接口中所有的方法都没有方法体,即都是没有实现的方法;

        3)在Golang中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口;

        4)只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型;

        5)一个自定义类型可以实现多个接口;

        6)Golang接口中不能有任何变量

        7)一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时如果要实现A接口,也必须将B,C接口的方法全部实现;

        8)interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil;

        9)空接口interface{}没有任何方法,所以所有类型都实现了空接口,即我们可以把任何一个变量赋给空接口。

    接口与继承:

      继承的价值主要在于:解决代码的复用性和可维护性。

      接口的价值主要在于:设计,设计好各种规范(方法),让其它自定义类型方法实现这些方法。

      接口比继承更加灵活,继承是满足 is - a 的关系,而接口只需要满足 like - a 的关系。

      接口在一定程度上实现代码解耦。

    多态:

      变量(实例)具有多种形态,面向对象的第三大特征,通过接口实现,可以按照统一的接口来调用不同的实现。这时接口变量就呈现不同的形态。

    类型断言:

      接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言。

        var t float32
        var x interface{}
        x = t
        y := x.(float32)
        print(y)

      如果在进行断言时,带上检测机制,如果成功就ok,否则也不要报panic

        var t float32 = 1.1
        var x interface{}
        x = t
        if y, ok := x.(float32); ok {
            fmt.Println("convert success")
            fmt.Println("y 的类型是 %T 值是 %V", y, y)
        }else {
            fmt.Println("convert fail")
        }
        fmt.Println("继续执行...")
    人生就是要不断折腾
  • 相关阅读:
    git branch查看不到分支的名字解决办法
    input输入框如何只能输入非零开头的正整数
    如何修改git分支名名称
    JavaScript如何把字符串中每个单词首字母转化为大写
    JavaScript原型链的理解
    JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈
    Vue中父子组件执行的先后顺序探讨
    我是不是该回来写点东西
    转载:引用 struts2标签详解
    mysql的重装问题......我自己的心得
  • 原文地址:https://www.cnblogs.com/xiangxiaolin/p/12094389.html
Copyright © 2011-2022 走看看