struct
我们可以声明新的类型,作为其它类型的属性或字段容器。
如,创建一个自定义类型person代表一个人的实体。这个实体拥有属性:姓名&年龄。这样的类型我们称之为struct。
type person struct{ name string age int }
var P person // P 现在就是 person 类型的变量了 P.name = "Astaxie" // 赋值 "Astaxie" 给 P 的 name 属性 . P.age = 25 // 赋值 "25" 给变量 P 的 age 属性 fmt.Printf("The person's name is %s", P.name) // 访问 P 的 name 属性 .
除了上面这种P的声明使用之外,还有其他两种声明使用方式
1、按照顺序提供初始化值
P := person{"Liuxinming", 28}
2、通过field:value的方式初始化,这样可以任意顺序
P := person{age:28, name:"Liuxinming"}
举例:
package mainimport "fmt"
//声明一个新的类型 type person struct { name string avg int }
//比较两个人的年龄,返回年龄大的那个人,并且返回年龄差 //struct 也是传值的 func older(p1, p2 person) (person, int) { if p1.avg > p2.avg { //比较p1和p2年龄 return p1, p1.avg - p2.avg } return p2, p2.avg - p1.avg }
func main() { var tom person //赋值初始化 tom.name, tom.avg = "Tom", 18
//两个字段都写清楚的初始化 bob := person{avg: 25, name: "Bob"}
//按照struct定义顺序初始化 paul := person{"Paul", 43}
tb_Older, tb_diff := older(tom, bob) tp_Older, tp_diff := older(tom, paul) bp_Older, bp_diff := older(bob, paul)
fmt.Printf("Of %s and %s, %s is older by %d years\n", tom.name, bob.name, tb_Older.name, tb_diff) fmt.Printf("Of %s and %s, %s is older by %d years\n", tom.name, paul.name, tp_Older.name, tp_diff) fmt.Printf("Of %s and %s, %s is older by %d years\n", bob.name, paul.name, bp_Older.name, bp_diff) }
输出结果如下:
Of Tom and Bob, Bob is older by 7 years Of Tom and Paul, Paul is older by 25 years Of Bob and Paul, Paul is older by 18 years
struct的匿名字段
我们上面介绍了如何定义一个struct,定义的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段。
当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct:
// struct2.go package mainimport ( "fmt" )
type Human struct { name string age int weight int } type Student struct { Human //匿名字段,那么默认struct就包含了Human所有字段 speciality string }
func main() { //初始化一个学生 mark := Student{Human{"Mark", 25, 100}, "Computer Science"}
//访问相应的字段 fmt.Println("His name is ", mark.name) fmt.Println("His age is ", mark.age) fmt.Println("His weight is ", mark.weight) fmt.Println("His speciality is ", mark.speciality)
//修改对应的信息 mark.speciality = "AI" fmt.Println("Mark changed his speciality") fmt.Println("His speciality is ", mark.speciality) // 修改他的年龄信息 fmt.Println("Mark become old") mark.age = 46 fmt.Println("His age is", mark.age) // 修改他的体重信息 fmt.Println("Mark is not an athlet anymore") mark.weight += 60 fmt.Println("His weight is", mark.weight) }
输出结果:
His name is Mark His age is 25 His weight is 100 His speciality is Computer Science Mark changed his speciality His speciality is AI Mark become old His age is 46 Mark is not an athlet anymore His weight is 160
类型断言(Type Assertion)是一个使用在接口值上的操作,用于检查接口类型变量所持有的值是否实现了期望的接口或者具体的类型。 在Go语言中类型断言的语法格式如下: value, ok := x.(T) 其中,x 表示一个接口的类型,T 表示一个具体的类型(也可为接口类型)。 该断言表达式会返回 x 的值(也就是 value)和一个布尔值(也就是 ok),可根据该布尔值判断 x 是否为 T
本文向大家介绍动态语言、动态类型语言、静态类型语言、强类型语言、弱类型语言介绍,包括了动态语言、动态类型语言、静态类型语言、强类型语言、弱类型语言介绍的使用技巧和注意事项,需要的朋友参考一下 关于如题这几个概念,大部分人应该比较熟悉,但是我昏了好久,所以写下来加深印象。 1. 动态语言 又叫动态编程语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如
主要内容:Go语言创始人,Go 是编译型语言,为什么要学习Go语言,Go语言吉祥物Go语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。Go 是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/ C++ 等编译型语言的性能与安全性”。 Go语言是编程语言设计的又一次尝试,是对类C语言的重大改进,它不但能让你访问底层操作系统,还提供了强大的网络编程和并发编程支持。Go语言的用途众多,可以进行网络编程、系统编程、并发编程
Go 语言简介 Go语言是由谷歌的罗布·派克(Rob Pike),罗伯特·格瑞史莫(Robert Griesemer),及肯·汤普逊于2007年9月开始设计Go语言,稍后Ian Lance Taylor, Russ Cox加入项目中。 Go语言于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后追加Windows系统下的实现。 谷歌资深软件工程师
主要内容:类型断言的书写格式,使用类型分支判断基本类型,使用类型分支判断接口类型type-switch 流程控制的语法或许是Go语言中最古怪的语法。 它可以被看作是类型断言的增强版。它和 switch-case 流程控制代码块有些相似。 一个 type-switch 流程控制代码块的语法如下所示: 输出结构如下: Type Square *main.Square with value &{5} 变量 t 得到了 areaIntf 的值和类型, 所有 case 语句中列举的类型
主要内容:区分类型别名与类型定义,非本地类型不能定义方法,在结构体成员嵌入时使用别名注意:本节内容涉及Go语言新版本的功能,内容上会涉及后续章节讲解的类型定义及结构体嵌入等特性。另外,本节内容适用于对Go语言很熟悉且正在关注工程升级、代码重构等问题的读者阅读。 类型别名是 Go 1.9 版本添加的新功能,主要用于解决代码升级、迁移中存在的类型兼容性问题。在 C/ C++ 语言中,代码重构升级可以使用宏快速定义一段新的代码,Go语言中没有选择加入宏,而是解决了重构中最麻烦的类型名变