结构struct

  1. Go 中的struct与C中的struct非常相似,并且Go没有class

  2. 使用 type <Name> struct{} 定义结构,名称遵循可见性规则(即首字母大写对外可见)。 type person struct{}

  3. 支持指向自身的指针类型成员,支持匿名结构,可用作成员或定义成员变量

  4. 匿名结构也可以用于struct的值,可以使用字面值对结构进行初始化

  5. 允许直接通过指针来读写结构成员

  6. 相同类型的成员可进行直接拷贝赋值

  7. 支持 == 与 != 比较运算符,但不支持 > 或 <

  8. 支持匿名字段,本质上是定义了以某个类型名为名称的字段

  9. 嵌入结构作为匿名字段看起来像继承,但不是继承

  10. 可以使用匿名字段指针

一、结构体的基本使用案例

package main

import "fmt"

/**
定义一个结构体,类似于其他语言的class
*/
type person struct {
Name string
Age int
} func main() {
// struct 对属性操作使用符号 . ;这里赋值采用两种方式,既可以使用默认值,也可以在外部赋值
a := person{
Name : "liang",
Age : 29,
}
//a.Age = 29
fmt.Println("a修改前:", a)
//第一次修改并打印
modifyPerson(a)
fmt.Println("a第一次修改后:", a)
//第二次修改并打印
modifyPersonPointer(&a)
fmt.Println("a第二次修改后:", a) /**
假如有一种场景有很多需要修改person内容,那么每次传入都需要取地址符号,这样很麻烦,可以在赋值对时候直接取得对应对地址
这种方式是开发对推荐方式
*/
b := &person{
Name : "xuli",
Age : 27,
}
fmt.Println("b修改前:", b)
modifyPersonPointer(b)
fmt.Println("b修改后:", b)
} /**
从打印结果可以看出这里传入对是值类型,修改person内容并不会修改person原始值
*/
func modifyPerson(per person) {
per.Age = 18
fmt.Println("修改时:", per)
} func modifyPersonPointer(per *person) {
per.Age = 19
fmt.Println("修改时:", per)
}

运行结果:

1
2
3
4
5
6
7
8
a修改前: {liang 29}
修改时: {liang 18}
a第一次修改后: {liang 29}
修改时: &{liang 19}
a第二次修改后: {liang 19}
b修改前: &{xuli 27}
修改时: &{xuli 19}
b修改后: &{xuli 19}

二、匿名结构体以及结构体内嵌案例

package main

import (
"fmt"
) /**
结构体嵌套,使用对就是匿名结构体
*/
type person struct {
UserName string
UserAge int
Constact struct{
Phone, City string
}
} func main() {
/**
匿名结构体对应用案例
*/
st := &struct {
Name string
Age int
}{
Name : "liang",
Age : 29,
}
fmt.Println(st) /**
机构体嵌套打印
*/
per := person{UserName: "liangyongxing", UserAge: 29}
per.Constact.Phone = "15701183662"
per.Constact.City = "北京"
fmt.Println(per)
}

运行结果:

1
2
&{liang 29}
{liangyongxing 29 {15701183662 北京}}

三、结构体的内嵌组合模拟继承案例

package main

import (
"fmt"
) /**
这里说对是结构体对组合,它对功能类似于其他语言对继承
*/
type Human struct {
sex int
} type teacher struct {
Human
Name string
Age int
} type Student struct {
Human
Name string
Age int
} func main() {
/**
在初始化对时候Go将嵌入对结构名称当成属性一样对待,将对应Human作为属性,这样可以在初始化对时候直接赋值
第二种赋值方式可以通过符号 . 来操作赋值
*/
tea := teacher{Name: "teacher", Age: 36, Human: Human{sex: 1}}
// tea.Human.sex = 1 或者 tea.sex = 1
stu := Student{Name: "student", Age: 15, Human: Human{sex: 2}}
//stu.Human.sex = 2 或者 tea.sex = 2
/**
1. 既然结构嵌入进来来,就和其他语言继承一样,可以直接使用父类对属性,即 tea.sex = 1 也是可以对
2. 那 1 方式简单为什么还要保留 tea.Human.sex = 1 这种方式呢?是因为为来防止外部引用有同名对属性,为了区分
*/
fmt.Println(tea)
fmt.Println(stu)
}

运行结果:

1
2
{{1} teacher 36}
{{2} student 15}

GO语言基础之struct的更多相关文章

  1. GO_06:GO语言基础之struct

    结构struct 1. Go 中的struct与C中的struct非常相似,并且Go没有class 2. 使用 type <Name> struct{} 定义结构,名称遵循可见性规则(即首 ...

  2. C#语言基础

    第一部分 了解C# C#是微软公司在2000年7月发布的一种全新且简单.安全.面向对象的程序设计语言,是专门为.NET的应用而开发的.体现了当今最新的程序设计技术的功能和精华..NET框架为C#提供了 ...

  3. C语言基础回顾

    第一章 C语言基础 1.  C语言编译过程 预处理:宏替换.条件编译.头文件包含.特殊符号 编译.优化:翻译并优化成等价的中间代码表示或汇编代码 汇编:生成目标文件,及与源程序等效的目标的机器语言代码 ...

  4. 【GoLang】GO语言系列--002.GO语言基础

    002.GO语言基础 1 参考资料 1.1 http://www.cnblogs.com/vimsk/archive/2012/11/03/2736179.html 1.2 https://githu ...

  5. 语言基础:C#输入输出与数据类型及其转换

    今天学习了C#的定义及特点,Visual Studio.Net的集成开发环境和C#语言基础. C#语言基础资料——输入输出与数据类型及其转换 函数的四要素:名称,输入,输出,加工 输出 Console ...

  6. 01_C语言基础

    内容提要: 1. C语言概述2. 数据类型.运算符与表达式3. C语言程序结构 4. VC6.0使用练习 知识详解01:C语言的历史 1. C语言与其它语言比较 汇编语言: (1).可直接对硬件进行操 ...

  7. C语言基础复习总结

    C语言基础复习总结 大一学的C++,不过后来一直没用,大多还给老师了,最近看传智李明杰老师的ios课程的C语言入门部分,用了一周,每晚上看大概两小时左右,效果真是顶一学期的课,也许是因为有开发经验吧, ...

  8. Go语言基础(二)

    Go语言基础(二) 跟着上篇,继续看Go基础 一.变量作用域 与C类似,有全局变量.局部变量.形参之分 package main import "fmt" // 全局变量 var ...

  9. Go语言基础之反射

    Go语言基础之反射 本文介绍了Go语言反射的意义和基本使用. 变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指 ...

随机推荐

  1. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之部署master/node节点组件(四)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 1.部署master组件 ...

  2. vsftp 虚拟用户+MySQL认证独立家目录

    centos7 系统 安装包 yum -y install mariadb vsftpd openssl-devel  mysql-devel  pam-devel yum -y groupinsta ...

  3. python 发送邮件(收到的邮件要有发送方才能回复)

    Python使用SMTP(简单邮件传输协议)发送邮件 普通文本邮件 普通文本邮件发送的实现,关键是要将MIMEText中_subtype设置为plain ## -*- coding: UTF-8 -* ...

  4. codevs 5971 打击犯罪

    5971 打击犯罪 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 某个地区有n(n<=1000)个犯罪团伙,当地警方按照他们 ...

  5. LCT维护子树信息

    有些题目,在要求支持link-cut之外,还会在线询问某个子树的信息.LCT可以通过维护虚边信息完成这个操作. 对于LCT上每个节点,维护两个两sz和si,后者维护该点所有虚儿子的信息,前者维护该点的 ...

  6. NEUQ OJ 2004:追梦之人 (计数数位dp)

    2004: 追梦之人 描述 题目描述: 为了纪念追梦人,粉丝们创造了一种新的数——“追梦数”.追梦数要满足以下两个条件:1.数字中不能出现“7”2.不能被7整除.比如:777和4396就不是追梦数,而 ...

  7. [POI2015]Myjnie

    [POI2015]Myjnie 题目大意: 有\(n(n\le50)\)家洗车店从左往右排成一排,每家店都有一个正整数价格\(d_i\). 有\(m(m\le4000)\)个人要来消费,第\(i\)个 ...

  8. Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 离散化 排列组合

    E. Mike and Geometry Problem 题目连接: http://www.codeforces.com/contest/689/problem/E Description Mike ...

  9. POJ 3061 Subsequence 尺取法,一个屌屌的O(n)算法

    Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9050   Accepted: 3604 Descr ...

  10. Jmeter实现对mysql的增、删、改、查

    1.          创建一个存储过程,语句如下: DELIMITER $$; DROP PROCEDURE IF EXISTS test; create PROCEDURE test() BEGI ...