Go-21-结构体
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-结构体的更多相关文章
- C语言基础:结构体 分类: iOS学习 c语言基础 2015-06-10 21:47 28人阅读 评论(0) 收藏
结构体:是一种用户自定义的数据类型 结构体定义 struct 结构体名 { 成员类型1 成员变量名1; 成员类型2 成员变量名2; -. }; typedef 原类型 ...
- c语言结构体
[C语言]21-结构体 本文目录 一.什么是结构体 二.结构体的定义 三.结构体变量的定义 四.结构体的注意点 五.结构体的初始化 六.结构体的使用 七.结构体数组 八.结构体作为函数参数 九.指向结 ...
- XmlRpc.net 出参字符串还原为结构体
上一篇随笔写的是入参结构体转字符串,现在需要把保存到服务器的字符串还原为结构体,这里记录一下操作步骤: 1. 格式化字符串. XmlRpcDeserializer 支持反序列化<struct&g ...
- OC基础--结构体 枚举做类成员属性
结构体 枚举作类的成员属性: 定义一个学生类 性别 -- 枚举 生日 入学日期 毕业日期 -- 结构体 代码示例: 声明文件 Student.h: #import <Foundation ...
- C#语言基础——结构体和枚举类型
结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...
- iOS学习06C语言结构体
1.结构体的概述 在C语言中,结构体(struct)指的是一种数据结构,是C语言中构造类型的其中之一. 在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名.年龄.身高 ...
- C#枚举类型和结构体
注意:枚举类型和结构体都属于值类型. 结构体:就是一个自定义的集合,里面可以放各种类型的元素,用法大体跟集合一样. 一.定义的方法: struct student { public int nianl ...
- Linux中表示“时间”的结构体和相关函数
转载于:http://blog.chinaunix.net/uid-25909722-id-2827364.html Linux中表示“时间”的结构体和相关函数 2011-09-13 17: ...
- C 结构体小结
看了三天结构体,是时候总结一下了. 关于结构体的声明: struct Student { ]; char sex; int age; ]; }; /*然后定义一个Student 类型的 student ...
- nsstring打印结构体
// // main.m // 09-常用结构体 // // Created by apple on 14-3-20. // Copyright (c) 2014年 apple. All ri ...
随机推荐
- 如何把数据放到C#的心里之 DB2实例
平时偶尔因为工作需要得自己写一些小工具去操作数据库,因为只是需要实现一些小的功能,也不涉及多类型的数据库,也许就是一次性的使用.所以此时那些大而全的数据库操作框架,也就不再那么适合我了.而本篇博文主要 ...
- Java编程开发之数据图表分析模型
数据统计分析 多曲线图表分析实现 基本需求分析 假设在怪兽出没的年岁,加上年关在即,需要统计分析各个道路卡口车流量出入统计,主要从车流量和车牌地角度出发.如图所示的业务需求: 道路卡口-车流量分析: ...
- C# 中 string.Empty、""、null的差别
一.string.Empty 和 "" 原文1 原文2 1. ...
- apicloud编译所需的ios证书的获取方法
在我们通过apicloud或hbuilderX这些工具打包ios应用的时候,需要一个ios证书. 那么我们如何生成这个ios证书呢?网上介绍的方法都是需要使用mac电脑,然后用mac电脑的钥匙串访问的 ...
- Java练习——抽象类
需求: 2辆宝马,1辆别克商务舱,1辆金龙(34)座,租5天共多少租金. 轿车 客车(金杯.金龙) 车型 别克商务舱GL8 宝马550i 别克林荫大道 <=16座 >16座 日租费(元 ...
- PAT-1043(Is It a Binary Search Tree)JAVA实现
Is It a Binary Search Tree PAT-1043 主要涉及到根据前序遍历序列片段是否是一颗二叉树,这里有一个小tip就是插入序列就是二叉树的前序遍历序列. 第二个是会对排序二叉树 ...
- 日志文件迁移至OSS
一台服务器在用阿里云ECS,因为穷,磁盘空间有限,服务器日志文件每天都在增长,需要定期清理释放磁盘空间,想到几种解决方案: 写任务定时备份到本地服务器 直接下载到本地用移动硬盘备份 备份到阿里云OSS ...
- SVN同步方式举例 FreeBSD
FreeBSD base 默认安装了svnlite 不需要单独安装SVN 软件 svnlite co svn.freebsd.org/ports/head/ /usr/local/ports -r5 ...
- WPF 基础 - 绘画 2) Path
1. Path 霸中霸 既可以替代其他几种图形,也可以将直线.圆弧.贝尔赛曲线组合起来; 重要属性:Geometry Data: 其中 Geometry 为抽象类,不可实例化,可使用其子类: Line ...
- 导出文件,responseType设置了blob,实际返回了JSON格式的错误信息的处理方式
需求:导出文件 问题描述:由于后台直接返回的文件流,在请求下载的方法中将XHR 的 responseType 指定为 blob 或者 arraybuffer.但并不是每次的操作都是成功的,所以在接口错 ...