面向对象之结构体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)
}

原文地址:https://www.cnblogs.com/green-frog-2019/p/11408032.html

时间: 2024-10-15 19:04:03

面向对象之结构体1的相关文章

面向对象基础——结构体

1.结构体的语法 定义的时候需要使用关键字struct [public] struct 结构名 { public 类型名 变量名; … } 我们常见的结构体:System.Drawing.Point.Size.Color 注意: 1.结构使用时可以new,也可以不new.如果不new,则使用前必须为结构成员赋值. 2.在结构中不能为变量直接赋初值,除非const(常量).static(静态变量) 2.结构体与类 它们是 .NET Framework 中的通用类型系统的两种基本构造.两者在本质上都

Go语言学习(十二)面向对象编程-结构体

1.结构体的初始化方式 例如自定义一个结构体 package main import( "fmt" ) type Rect struct{ //type和struct为关键字 x,y float64 //结构体成员 widh,height float64 } func (r *Rect) Area() float64{ return r.width * r.height } func main(){ //初始结构体的几种方式: rect1 := new(Rect) rect2 := &

Golang基础之结构体

Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型.我们可以基于内置的基本类型定义,也可以通过struct定义.例如: // 将MyInt定义为int类型 type MyInt i

Go语言基础之结构体

Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型.我们可以基于内置的基本类型定义,也可以通过struct定义.例如: //将MyInt定义为int类型 type MyInt int 通过Type关键字的定义,

《objective-c基础教程》学习笔记(三)—— 从结构体到面向对象

一听标题,感觉十分的抽象.面向对象就是(Object-Oriented Programming)的首字母缩写:OOP,是当今最主流的编程方法. 那么,面向对象编程具体有什么好处呢.是如何来实现呢?通过下面的实例,我想可以给大家最简单直观的理解了. 好了,下面就来说说我们这篇博文主要要介绍的内容吧.今天,我们通过一个绘制几何图形的实例来介绍基本的面向对象思想. 首先我们,新建一个Command Tools的命令行工具项目,选择Foundation头文件. 1 / 2 // main.m 3 //

【C/C++学院】0817-递归汉诺塔 双层递归 /CPP结构体 /面向过程与面向对象的编程模式/类的常识共用体实现一个类的特征/QT应用于类以及类的常识

递归汉诺塔 双层递归 #include <iostream> void han(int n, char A, char B, char C) { static int num = 1; std::cout << "第" << num << "次"; num++; if (n<1) { return; } else { han(n - 1, A, C, B); std::cout << A <&l

iOS runtime探究(一): 从runtime开始理解面向对象的类到面向过程的结构体

你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639205 本文主要讲解runtime相关知识,从原理到实践,由于包含内容过多分为以下五篇文章详细讲解,可自行选择需要了解的方向: 从runtime开始: 理解面向对象的类到面向过程的结构体 从runtime开始: 深入理解OC消息转发机制 从runtime开始: 理解OC的属性property 从runtime开始: 实践Category添加属

Swift面向对象基础(上)——Swift中的类和结构体(下)

学习来自<极客学院> 1 import Foundation 2 3 class User { 4 var name:String 5 var age:Int 6 init(name:String,age:Int){ 7 self.age = age 8 self.name = name 9 } 10 } 11 var u1 = User(name:"何杨",age:23) 12 var u2 = User(name:"何杨",age:23) 13 pr

Swift面向对象基础(上)——Swift中的类和结构体(上)

学习来自<极客学院> 1 import Foundation 2 3 //1.定义类和结构体 4 /* 5 [修饰符]calss 类名{ 6 零到多个构造器 7 零到多个属性 8 零到多个方法 9 零到多个下标 10 } 11 修饰符可以是:private public internal final 12 */ 13 14 /*定义结构体 15 [修饰符]struct 结构体名{ 16 17 } 18 修饰符可以是:private public internal 19 */ 20 21 /*