zoukankan      html  css  js  c++  java
  • 面向对象之结构体1

    Golang语言面向对象编程说明:

      1)Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。

      2)Golang没有类(class),Go语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解Golang是基于struct来实现OOP特性的。

      3)Golang面向对象编程非常简洁,去掉了传统OOP语言的继承、方法重载、构造函数和析构函数、隐藏的this指针等等。

      4)Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样,比如继承:Golang没有extends 关键字,继承是通过匿名字段来实现。

      5)Golang面向对象(OOP)很优雅,OOP本身就是语言类型系统(type system)的一部分,通过接口(interface)关联,耦合性低,也非常灵活。后面会充分体会到这个特点。也就是说在Goalng中面向接口编程是非常重要的特性。

    看一个养猫猫问题:

      张老太养了两只猫猫:一只名字叫小白,今年3岁,白色。还有一只叫小花,今年100岁,花色。请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,年龄,颜色。如果用户输入的小猫名错误,则显示张老太没有这只猫猫。

    使用现有技术解决:

    1)单独的定义变量解决

    func main() {

      // 1.使用变量的处理
      var cat1Name string = "小白"
      var cat1Age int = 3
      var cat1Color string = "白色"

      var cat2Name string = "小花"
      var cat1Age int = 100
      var cat1Color string = "花色"
    }

    2)使用数组解决

    func main() {

      // 2.使用数组解决
      var catNames [2]string = [..]string{"小白","小花"}
      var catAges [2]int = [..]int{3, 100}
      var catColers [2]string = [..]string{"白色","花色"}
    }

    现有技术结局的缺点分析:

    1)使用变量或者数组来解决养猫的问题,都不利于数据的管理和维护。因为名字,年龄,颜色都是属于一只猫,但是这里是分开保存。

    2)如果我们希望对一只猫的属性(名字、年龄、颜色)进行操作(绑定方法)也不好处理。

    3)引出我么要讲解的技术==》结构体

    结构体与结构体变量(实例/对象)的关系示意图:

    对上图说明:

      1)将一类事物的特征提取出来(比如猫类),形成一个新的数据类型,就是一个结构体。

      2)通过这个结构体,我们可以创建多个变量(实例/对象)

      3)事物可以是猫类,也可以是Person, Fish 或是某个工具类。。。

    快速入门-面向对象的方式(struct)解决养猫问题

    package main
    import (
      "fmt"
    )

    //定义一个Cat结构体,将Cat的各个字段/属性信息,放入到Cat结构体进行管理
    type Cat struct {
      Name string
      Age int
      Color string
      Hobby string
    }


    func main() {

      //张老太养了两只猫猫:一只名字叫小白,今年3岁,白色。
      //还有一只叫小花,今年100岁,花色。
      //请编写一个程序,当用户输入小猫的名字时,就显示该猫的名字,
      //年龄,颜色。如果用户输入的小猫名错误,
      //则显示张老太没有这只猫猫。

      // 使用struct来完成案例
      // 创建一个Cat的变量

      var cat1 Cat   // var a int
      cat1.Name = "小白"
      cat1.Age = 3
      cat1.Color = "白色"
      cat1.Hobby = "吃鱼"
      fmt.Println("cat1=", cat1)

      fmt.Println("猫猫的信息如下:")
      fmt.Println("name=", cat1.Name)
      fmt.Println("age=", cat1.Age)
      fmt.Println("color=", cat1.Color)
      fmt.Println("hobby=", cat1.Hobby)
    }

    结构体和结构体变量(实例)的区别和联系:

    通过前面的案例和讲解我们可以看出:

    1)结构体是自定义的数据类型,代表一类事物

    2)结构体变量(实例)是具体的,实际的,代表一个具体变量


    结构体变量(实例) 在内存中的布局:

    结构体声明和使用陷阱:

    如何声明结构体:

    type 结构体名称 struct {
      field1 type
      field2 type
    }

    举例:

    type Student struct {
      Name string
      Age int
      Score float32
    }

    ‘字段/属性

    基本介绍:

      1)从概念或叫法上看:结构体字段=属性=field (即授课中,统一叫字段)

      2)字段是结构体的一个组成部分,一般是基本数据类型、数组,也可以是引用类型。比如我们前面定义猫结构体 的 Name string 就是属性


    注意事项和细节说明:

      1)字段声明语法同变量,示例:字段名 字段类型

      2)字段的类型可以为:基本类型、数组或引用类型

      3)在创建一个结构体变量后,如果没有给字段赋值,都对应一个零值(默认值),规则同前面讲的一样:

        布尔类型是 false, 整型是 0, 字符串是 ""
        数组类型的默认值和它的元素类型相关,比如 score [3]int 则为 [0, 0, 0]
        指针,slice,和map的零值都是 nil,即还没有分配空间。

    案例演示:

    package main
    import (
      "fmt"
    )

    //如果结构体的字段类型是:指针,slice,和map的零值都是nil,即还没有分配空间
    //如果需要使用这样的字段,需要先make,才能使用。

    type Person struct {
      Name string
      Age int
      Scores [5]float64
      ptr *int //指针
      slice []int //切片
      map1 map[string]string //切片
    }

    func main() {

      //定义一个结构体变量
      var p1 Person
      fmt.Println(p1)
      if p1.ptr == nil {
        fmt.Println("ok1")
      }
      if p1.slice == nil {
        fmt.Println("ok2")
      }
      if p1.map1 == nil {
        fmt.Println("ok3")
      }

      //使用slice,再次说明,一定要make
      p1.slice = make([]int, 10)
      p1.slice[0] = 100

      //使用map,也一定要先make
      p1.map1 = make(map[string]string)
      p1.map1["key1"] = "tom"
      fmt.Println(p1)
    }

    4)不同结构体变量的字段是独立,互不影响,一个结构体变量字段的更改,不影响另外一个。

    type Monster struct {
      Name string
      Age int
    }

    func main() {

      var monster1 Monster
      monster1.Name = "牛魔王"
      monster1.Age = 500

      monster2 := monster1 //结构体是值类型,默认为值拷贝
      monster2.Name = "青牛精"

      fmt.Println("monster1=", monster1)
      fmt.Println("monster2=", monster2)
    }

  • 相关阅读:
    意见簿---在批评中成长
    团队冲刺——第六天
    团队冲刺——第五天
    团队冲刺--第四天
    小知识:引入properties时,遇到@Value("${xxxxx}")时,报注入失败的错误
    小知识:springCloudConfgServer启动时报警告:.c.s.e.MultipleJGitEnvironmentRepository : Could not fetch remote for master remote:
    小知识:springCloudConfig进行配置更新时报错:actuator/refresh报错 Get method not surport
    小知识:SpringCloudConfigServer从git获取配置信息报错:.c.s.e.MultipleJGitEnvironmentRepository : Error occured cloning to base directory.
    小知识:springCloudConfigServer连接git报错:.c.s.e.MultipleJGitEnvironmentRepository : Error occured cloning to base directory.
    小知识:最近发现http://maven.aliyun.com/nexus/content/groups/public的仓库,pom下载jar包失败了
  • 原文地址:https://www.cnblogs.com/green-frog-2019/p/11408032.html
Copyright © 2011-2022 走看看