ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 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的指针的值,而不是修改拷贝的东西 } ~~~