package main
import "fmt"
//Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型。
//Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性。
//Go 语言中的类型可以被实例化,使用new或&构造的类型实例的类型是类型的指针。
/*结构体成员是由一系列的成员变量构成,这些成员变量也被称为“字段”。字段有以下特性:
1.字段拥有自己的类型和值。
2.字段名必须唯一。
3.字段的类型也可以是结构体,甚至是字段所在结构体的类型。
*/
func main () {
/*
使用关键字 type 可以将各种基本类型定义为自定义类型,基本类型包括整型、字符串、布尔等。
结构体是一种复合的基本类型,通过 type 定义为自定义类型后,使结构体更便于使用:
结构体的定义格式如下:
type 类型名 struct {
字段1 字段1类型
字段2 字段2类型
}
说明:
类型名:标识自定义结构体的名称,在同一个包内不能重复。
struct{}:表示结构体类型,type 类型名 struct{}可以理解为将 struct{} 结构体定义为类型名的类型。
字段1、字段2……:表示结构体字段名,结构体中的字段名必须唯一。
字段1类型、字段2类型……:表示结构体各个字段的类型。
*/
//声明有名的结构体,字段类型相同可以放在同一行
type people struct{
name ,address string
age int
}
//结构体初始化,并且按位置传参
var woman people = people{"李清照","江苏",18}
fmt.Println(woman)
//按key关键字传参,可以乱序,可以少传
var woman1 people = people{name:"蔡文姬",age:28}
fmt.Println(woman1)
/*匿名结构体。需要定义在函数内部。不需要type关键字。只是用一次,可以把一堆属性封装到对象中,
方式一:
var 变量名 = struct {
属性 类型
属性 类型
}{初始化传参}
方式二:
var 变量名 struct {
属性 类型
属性 类型
}
变量名.属性 = 值
*/
//匿名结构体方式一
var pc = struct{
mouse string
keyboard string
}{keyboard:"logi"}
fmt.Println(pc)
//匿名结构体方式二
var moblie struct{
tel string
name string
}
moblie.tel = "178787"
moblie.name = "李白"
fmt.Println(moblie)
/*结构体的定义只是一种内存布局的描述,只有当结构体实例化时,才会真正地分配内存
实例化就是根据结构体定义的格式创建一份与格式一致的内存区域,结构体实例与实例间的内存是完全独立的。
Go语言可以通过多种方式实例化结构体,根据实际需要可以选用不同的写法
*/
//结构体本身是一种类型,可以像整型、字符串等类型一样,以 var 的方式声明结构体即可完成实例化:
var man people
man.name = "周杰伦"
man.address = "中国"
man.age = 80
fmt.Println(man)
}