# GO Types Struct
### Author 品茶
> 结构体是一种聚合数据类型,是由零个或多个任意类型的值聚合合成的实体,每个值称为结构体的成员。
> 在GO语言中,所有函数的参数都是值拷贝传入的,所以我们如果想修改原值则需要传入指针。否则就是值拷贝的修改。
> 如果结构体全部成员都是可以比较的,那么结构体也就可以比较 == !=
> 结构体可以用于其它复合类型当中
~~~
// 定义一个结构体
type Employee struct {
ID int
Name string
Address string
Dob time.Time
Position string
Salary int
ManagerId int
}
func main() {
var zwhset Employee // 变量初始化为零值,并对结构体赋值,
zwhset.Name = "zuowenhong"
zwhset.ID = 1
zwhset.Address = "BeiJing"
fmt.Println(zwhset.Name) // 点操作符访问结构体成员
// 取址操作
name := &zwhset.Name
*name = "l0est" // 指针位置修改值
fmt.Println(zwhset.Name) // 普通访问值
fmt.Println(*name) // 指针值
// 点操作符可以和指向结构体指针一起工作
var l0set *Employee = &zwhset // * 与 & 一般配对出现
l0set.Name = "CNTea" // 相当于 (*l0set).Name = "CNTea"
fmt.Println(l0set.Name, zwhset.Name)
// 结构体初始化 2种方法不能混合使用
type Point struct{ X, Y int }
// 1 位置初始化赋值
_ = Point{1, 2} // color.RGBA{red,green,blue,alpha} 常用在这种位置初始化
// 2 关键字寝化
_ = Point{
X: 1,
Y: 2,
}
// 大写可导出,小写不可导出,没有技巧可以取出小写
type Coint struct {
X int // 大写可被导出
y int // 小写,不可被导出
}
// 结构化指针处理
_ = &Point{1, 2} // -> pp := new(Point) *pp = Point{1,2} new创建指针
// 结构化比较
// 结构体用于其它复合类型中
type address struct {
hostname string
port int
}
hits := make(map[address]int) // key -> address value -> int
hits[address{"golang.org", 443}]++ // key ++
// 结构体嵌入 结构更明确
type Data struct { // data struct
Hosts []string
Port int
}
type Result struct {
Message string
Code int
Data Data // 嵌入data结构体
}
// 访问结构体中成员 更加麻烦,可以使用匿名成员
var r Result
hosts := []string{"google.com"}
r.Data.Hosts = hosts
// 匿名成员
type Result1 struct {
Data // 匿名成员
Code int
Message string
}
// 匿名成员通过叶子属性访问
var r1 Result1
r1.Hosts = hosts //叶子属性直接访问hosts
r1.Port = 80 // -> r1.Data.Port
r1.Data.Port = 443 // 同样是有效的
// 匿名成员赋值问题,不能用叶子访问去赋值
r2 := Result1{
Data: Data{ //可以不带前面的Data
Hosts: hosts,
Port: 443,
},
}
fmt.Printf("%#v\n", r2)
}
// 函数值拷贝
func value(e *Employee) {
e.Salary = 5000 // 这是修改e的指针的值,而不是修改拷贝的东西
}
~~~