Go语言的面向对象

其他编程语言大多使用关键字“类”(class)来定义封装对象,表示该类的具体特征,然而Go并不是一个纯面向对象的编程语言。Go语言采用更灵活的“结构体”替代了“类”。

Go语言并没有提供类(class),但是它提供了结构体(struct),方法(method)可以在结构体上添加。与类相似,结构体提供了捆绑数据和方法的行为。

Go语言没有继承,虚方法,构造方法和析构方法

虽然Go语言没有继承和多态,Go语言可以通过匿名字段实现继承通过接口实现多态。在Go语言中学习面向对象,主要学习结构体(struct)、方法(method)、接口(interface)。

定义结构体与实例化

结构体是由一系列相同类型或不同类型的数据构成的数据集合。

  1. type 类型名 struct{
  2. 成员属性1 类型1
  3. 成员属性2 类型2
  4. 成员属性3,成员属性4 类型3
  5. }

注意:

1. 类型名在同一个包下,不可以重复

2. 属性唯一

3. 结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正分配内存

结构体的初始化:

  1. package main

    import "fmt"

    // 结构体
    type Student struct {
    name string
    age int
    sex byte
    }
    func main() {
    //1.var 声明方式实例化结构体,初始化方式为:对象.属性=值
    var s1 Student
    fmt.Print(s1)
    fmt.Printf("t1:%T,%v,%q \n",s1,s1,s1)
    s1.name="sixinshuier"
    s1.age=18
    s1.sex=1
    fmt.Println(s1)
    //2. 变量简短方式声明实例化结构体
    s2:=Student{}
    s2.name="shuier"
    s2.age=17
    s2.sex=1
    fmt.Println(s2)
    //3. 变量简短
    s3:=Student{
    name:"sixinshui",
    age:19,
    sex: 1,
    }
    fmt.Println(s3)
    //4.省略属性名
    s4:=Student{"sixin",19,0}
    fmt.Println(s4)
    //5. 使用new内置函数实例化struct
    s5:= new(Student)
    fmt.Printf("stu:%T,%v,%p \n",s5,s5,s5)
    (*s5).name="huahua"
    (*s5).age=20
    (*s5).sex=0
    fmt.Println(s5)
    //语法糖写法
    s5.name="si"
    s5.sex=21
    s5.age=1
    fmt.Println(s5)
    }

结构体是值类型

结构体是值类型, 值类型是深拷贝,深拷贝就是为新的对象分配了内存。引用类型是浅拷贝,浅拷贝只是复制了对象的指针

  1. package main
  2.  
  3. import "fmt"
  4.  
  5. type Flower struct {
  6. name string
  7. coler string
  8. }
  9. func main() {
  10. f1:=Flower{"百合","白色"}
  11. fmt.Printf("f1:%T,%v,%p \n",f1,f1,&f1)
  12. fmt.Println("#####################")
  13. //将结构体对象作为参数(值传递)
  14. changeFlower1(f1)
  15. fmt.Printf("f1:%T,%v,%p \n",f1,f1,&f1)
  16. fmt.Println("#####################")
  17. //将结构体指针作为参数参数传递
  18. changeFlower2(&f1)
  19. fmt.Printf("f1:%T,%v,%p \n",f1,f1,&f1)
  20. fmt.Println("#####################")
  21. //将结构体对象作为返回值
  22. f2:=getFlower1()
  23. f3:=getFlower1()
  24. fmt.Println(f2,f3)
  25. fmt.Println("#####################")
  26. f3.name="桃花"
  27. fmt.Println(f2,f3)
  28. fmt.Println("#####################")
  29. f4:=getFlower2()
  30. f5:=getFlower2()
  31. fmt.Println(f4,f5)
  32. f4.name="樱花"
  33. fmt.Println(f4,f5)
  34. }
  35. func getFlower1() (f Flower) {
  36. f=Flower{"狗尾巴草","绿"}
  37. fmt.Printf("f1:%T,%v,%p \n",f,f,&f)
  38. return
  39. }
  40. func getFlower2() (f *Flower) {
  41. f1:=Flower{"狗尾巴草","绿"}
  42. fmt.Printf("f1:%T,%v,%p \n",f1,f1,&f1)
  43. f=&f1
  44. return
  45. }
  46.  
  47. //将结构体对象作为参数传递
  48. func changeFlower1(f Flower){
  49. f.name="玫瑰"
  50. f.coler="紫色"
  51. fmt.Printf("func1:%T,%v,%p \n",f,f,&f)
  52. fmt.Println("#####################")
  53. }
  54.  
  55. //将结构体指针作为参数传递
  56. func changeFlower2(f *Flower) {
  57. f.name="栀子花"
  58. f.coler="白色"
  59. fmt.Printf("func1:%T,%v,%p \n",f,f,&f)
  60. fmt.Println("#####################")
  61. }

匿名结构体

匿名结构体就是没有名字的结构体,无须通过type关键字定义就可以直接使用。创建匿名结构体时,同时要创建对象。匿名结构体由结构体定义和键值对初始化两部分组成

  1. 变量名:=struct{
  2. // 定义成员属性
  3. }{//初始化成员属性}
  1. f1:=struct{
  2. name,coler string
  3. }("康乃馨""红")

结构体嵌套

将一个结构体作为另一个结构体的属性(字段),这种结构就是结构体嵌套。‘

结构体嵌套可以模拟面向对象编程中的以下两种关系。

• 聚合关系:一个类作为另一个类的属性。

• 继承关系:一个类作为另一个类的子类。子类和父类的关系。

  1. type Person struct{
  2. Name string
  3. Age int
  4. }
  5.  
  6. type Student struct{
  7. *Person
  8. Number int
  9. }
  10.  
  11. // 不推荐这种初始化,一旦struct增加字段,则整个初始化语句会报错
  12. a:=Person{"TOM",21}
  13.  
  14. //建议这种
  15. p:=&Person{
  16. Name:"Tom",
  17. Age:12
  18. }
  19.  
  20. s:=Student{
  21. Person:p,
  22. Number:110
  23. }

Go-21-结构体的更多相关文章

  1. C语言基础:结构体 分类: iOS学习 c语言基础 2015-06-10 21:47 28人阅读 评论(0) 收藏

    结构体:是一种用户自定义的数据类型 结构体定义 struct 结构体名 {     成员类型1  成员变量名1;     成员类型2  成员变量名2;      -. }; typedef   原类型 ...

  2. c语言结构体

    [C语言]21-结构体 本文目录 一.什么是结构体 二.结构体的定义 三.结构体变量的定义 四.结构体的注意点 五.结构体的初始化 六.结构体的使用 七.结构体数组 八.结构体作为函数参数 九.指向结 ...

  3. XmlRpc.net 出参字符串还原为结构体

    上一篇随笔写的是入参结构体转字符串,现在需要把保存到服务器的字符串还原为结构体,这里记录一下操作步骤: 1. 格式化字符串. XmlRpcDeserializer 支持反序列化<struct&g ...

  4. OC基础--结构体 枚举做类成员属性

    结构体  枚举作类的成员属性: 定义一个学生类 性别 -- 枚举 生日 入学日期  毕业日期  --  结构体 代码示例: 声明文件 Student.h: #import <Foundation ...

  5. C#语言基础——结构体和枚举类型

    结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...

  6. iOS学习06C语言结构体

    1.结构体的概述 在C语言中,结构体(struct)指的是一种数据结构,是C语言中构造类型的其中之一. 在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名.年龄.身高 ...

  7. C#枚举类型和结构体

    注意:枚举类型和结构体都属于值类型. 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianl ...

  8. Linux中表示“时间”的结构体和相关函数

    转载于:http://blog.chinaunix.net/uid-25909722-id-2827364.html      Linux中表示“时间”的结构体和相关函数 2011-09-13 17: ...

  9. C 结构体小结

    看了三天结构体,是时候总结一下了. 关于结构体的声明: struct Student { ]; char sex; int age; ]; }; /*然后定义一个Student 类型的 student ...

  10. nsstring打印结构体

    // //  main.m //  09-常用结构体 // //  Created by apple on 14-3-20. //  Copyright (c) 2014年 apple. All ri ...

随机推荐

  1. 如何把数据放到C#的心里之 DB2实例

    平时偶尔因为工作需要得自己写一些小工具去操作数据库,因为只是需要实现一些小的功能,也不涉及多类型的数据库,也许就是一次性的使用.所以此时那些大而全的数据库操作框架,也就不再那么适合我了.而本篇博文主要 ...

  2. Java编程开发之数据图表分析模型

    数据统计分析 多曲线图表分析实现 基本需求分析 假设在怪兽出没的年岁,加上年关在即,需要统计分析各个道路卡口车流量出入统计,主要从车流量和车牌地角度出发.如图所示的业务需求: 道路卡口-车流量分析: ...

  3. C# 中 string.Empty、""、null的差别

    一.string.Empty 和 ""                                                           原文1   原文2 1. ...

  4. apicloud编译所需的ios证书的获取方法

    在我们通过apicloud或hbuilderX这些工具打包ios应用的时候,需要一个ios证书. 那么我们如何生成这个ios证书呢?网上介绍的方法都是需要使用mac电脑,然后用mac电脑的钥匙串访问的 ...

  5. Java练习——抽象类

    需求: 2辆宝马,1辆别克商务舱,1辆金龙(34)座,租5天共多少租金.   轿车 客车(金杯.金龙) 车型 别克商务舱GL8 宝马550i 别克林荫大道 <=16座 >16座 日租费(元 ...

  6. PAT-1043(Is It a Binary Search Tree)JAVA实现

    Is It a Binary Search Tree PAT-1043 主要涉及到根据前序遍历序列片段是否是一颗二叉树,这里有一个小tip就是插入序列就是二叉树的前序遍历序列. 第二个是会对排序二叉树 ...

  7. 日志文件迁移至OSS

    一台服务器在用阿里云ECS,因为穷,磁盘空间有限,服务器日志文件每天都在增长,需要定期清理释放磁盘空间,想到几种解决方案: 写任务定时备份到本地服务器 直接下载到本地用移动硬盘备份 备份到阿里云OSS ...

  8. SVN同步方式举例 ​​​​ FreeBSD

    FreeBSD base  默认安装了svnlite 不需要单独安装SVN 软件 svnlite co svn.freebsd.org/ports/head/ /usr/local/ports -r5 ...

  9. WPF 基础 - 绘画 2) Path

    1. Path 霸中霸 既可以替代其他几种图形,也可以将直线.圆弧.贝尔赛曲线组合起来; 重要属性:Geometry Data: 其中 Geometry 为抽象类,不可实例化,可使用其子类: Line ...

  10. 导出文件,responseType设置了blob,实际返回了JSON格式的错误信息的处理方式

    需求:导出文件 问题描述:由于后台直接返回的文件流,在请求下载的方法中将XHR 的 responseType 指定为 blob 或者 arraybuffer.但并不是每次的操作都是成功的,所以在接口错 ...