结构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 : ,
}
//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 : ,
}
fmt.Println("b修改前:", b)
modifyPersonPointer(b)
fmt.Println("b修改后:", b)
} /**
从打印结果可以看出这里传入对是值类型,修改person内容并不会修改person原始值
*/
func modifyPerson(per person) {
per.Age =
fmt.Println("修改时:", per)
} func modifyPersonPointer(per *person) {
per.Age =
fmt.Println("修改时:", per)
}

运行结果:

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 : ,
}
fmt.Println(st) /**
机构体嵌套打印
*/
per := person{UserName: "liangyongxing", UserAge: }
per.Constact.Phone = ""
per.Constact.City = "北京"
fmt.Println(per)
}

运行结果:

&{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: , Human: Human{sex: }}
// tea.Human.sex = 1 或者 tea.sex = 1
stu := Student{Name: "student", Age: , Human: Human{sex: }}
//stu.Human.sex = 2 或者 tea.sex = 2
/**
1. 既然结构嵌入进来来,就和其他语言继承一样,可以直接使用父类对属性,即 tea.sex = 1 也是可以对
2. 那 1 方式简单为什么还要保留 tea.Human.sex = 1 这种方式呢?是因为为来防止外部引用有同名对属性,为了区分
*/
fmt.Println(tea)
fmt.Println(stu)
}

运行结果:

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

最新文章

  1. Laravel大型项目系列教程(一)
  2. 还是要好好研究开源的php
  3. JavaWeb出现404一个很隐蔽的原因
  4. ECMASCRIPT 6中字符串的新特性
  5. android 获取当前位置
  6. java解析properties文件
  7. uva 10916 Factstone Benchmark(对数函数的活用)
  8. iOS ipa包瘦身------删除无用图片资源
  9. Redis进阶实践之九 独立封装的RedisClient客户端工具类
  10. Visual C++ 6.0中关于for的简单问题
  11. Centos 7下网卡bonding配置之mode4
  12. 在HTML5的 input:file 上传文件类型控制 遇到的问题
  13. kolla-ansible源码分析
  14. recovery 升级过程LED灯闪烁
  15. 从Stampery到Chronicled,区块链公证业务的实践
  16. Transfrom笔记
  17. WPF datagrid 设置表头线与颜色、透明度
  18. java-使用SImpleDateFormat格式化时间输出
  19. CentOS6下yum升级安装mysql
  20. PHP使用RabbitMQ

热门文章

  1. Daily Scrumming 2015.10.20(Day 1)
  2. 实验1:java开发环境的熟悉
  3. gogoing软件NABCD
  4. FileInputStream与FileOutputStream练习题 -------------------图片拷贝
  5. 《TCP/IP 详解 卷1:协议》第 11 章:名称解析和域名系统
  6. 【CSAPP笔记】7. 汇编语言——过程调用
  7. 上传插件(WebUploader)
  8. Akka系列---什么是Actor
  9. 关于jsonp知识的理解
  10. pycharm 修改新建文件时的头部模板