Go语言的面向对象

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

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

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

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

定义结构体与实例化

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

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

注意:

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

2. 属性唯一

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

结构体的初始化:

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)
}

结构体是值类型

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

package main

import "fmt"

type Flower struct {
name string
coler string
}
func main() {
f1:=Flower{"百合","白色"}
fmt.Printf("f1:%T,%v,%p \n",f1,f1,&f1)
fmt.Println("#####################")
//将结构体对象作为参数(值传递)
changeFlower1(f1)
fmt.Printf("f1:%T,%v,%p \n",f1,f1,&f1)
fmt.Println("#####################")
//将结构体指针作为参数参数传递
changeFlower2(&f1)
fmt.Printf("f1:%T,%v,%p \n",f1,f1,&f1)
fmt.Println("#####################")
//将结构体对象作为返回值
f2:=getFlower1()
f3:=getFlower1()
fmt.Println(f2,f3)
fmt.Println("#####################")
f3.name="桃花"
fmt.Println(f2,f3)
fmt.Println("#####################")
f4:=getFlower2()
f5:=getFlower2()
fmt.Println(f4,f5)
f4.name="樱花"
fmt.Println(f4,f5)
}
func getFlower1() (f Flower) {
f=Flower{"狗尾巴草","绿"}
fmt.Printf("f1:%T,%v,%p \n",f,f,&f)
return
}
func getFlower2() (f *Flower) {
f1:=Flower{"狗尾巴草","绿"}
fmt.Printf("f1:%T,%v,%p \n",f1,f1,&f1)
f=&f1
return
} //将结构体对象作为参数传递
func changeFlower1(f Flower){
f.name="玫瑰"
f.coler="紫色"
fmt.Printf("func1:%T,%v,%p \n",f,f,&f)
fmt.Println("#####################")
} //将结构体指针作为参数传递
func changeFlower2(f *Flower) {
f.name="栀子花"
f.coler="白色"
fmt.Printf("func1:%T,%v,%p \n",f,f,&f)
fmt.Println("#####################")
}

匿名结构体

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

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

结构体嵌套

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

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

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

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

type Person struct{
Name string
Age int
} type Student struct{
*Person
Number int
} // 不推荐这种初始化,一旦struct增加字段,则整个初始化语句会报错
a:=Person{"TOM",21} //建议这种
p:=&Person{
Name:"Tom",
Age:12
} s:=Student{
Person:p,
Number:110
}

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. Python爬虫_qq音乐示例代码

    import requests url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp' for x in range(5): headers ...

  2. restful风格的理解

    简而言之,就是不同的命令响应不同的操作: 关注点在url中的不同参数,是因为不同的参数才使得不同的method去对应的不同的操作.

  3. 微信小程序:给data中对象中的属性设置值与给data中的属性或对象或数组设置值的区别

    一.给data中的属性或对象或数组设置值,属性名不需要加引号 this.setData({ material: param, // 这里material为对象 } this.setData({   d ...

  4. JAVA 判断一个字符串是否是合法的日期格式?

    采用SimpleDateFormat类的parse方法进行判断,如果转换不成功,就会出现异常.另外,还需要判断字符串的长度,若不判断,第二个字符串就会验证通过,实际上也不是合法的.话不多说,且看代码: ...

  5. Django框架的forms组件与一些补充

    目录 一.多对多的三种创建方式 1. 全自动 2. 纯手撸(了解) 3. 半自动(强烈推荐) 二.forms组件 1. 如何使用forms组件 2. 使用forms组件校验数据 3. 使用forms组 ...

  6. 一次Ubuntu16.04 虚拟机挂起,ping不到网络引发的思考

    虚拟机挂起 无网络 情况复现 can@ubuntu:~$ ping www.baidu.com ping: unknown host www.baidu.com 挂起重开虚拟机,遇到无网络状态: 首先 ...

  7. 【秒懂音视频开发】02_Windows开发环境搭建

    音视频开发库的选择 每个主流平台基本都有自己的音视频开发库(API),用以处理音视频数据,比如: iOS:AVFoundation.AudioUnit等 Android:MediaPlayer.Med ...

  8. 剑指 Offer 44. 数字序列中某一位的数字 + 找规律 + 数位

    剑指 Offer 44. 数字序列中某一位的数字 Offer_44 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author Wale ...

  9. C# 基础 - 日志捕获二使用 log4net

    引入 log4net.dll 项目->添加->新建项->应用程序配置文件,命名为 log4net.config,并把属性的复制到输出目录设置为 如果较新则复制,后续客户端需要读取在 ...

  10. 浅析MyBatis(一):由一个快速案例剖析MyBatis的整体架构与运行流程

    MyBatis 是轻量级的 Java 持久层中间件,完全基于 JDBC 实现持久化的数据访问,支持以 xml 和注解的形式进行配置,能灵活.简单地进行 SQL 映射,也提供了比 JDBC 更丰富的结果 ...