1 struct
- Go 中的struct与C中的struct非常相似,并且Go没有class
- 使用 type struct{} 定义结构,名称遵循可见性规则
- 支持指向自身的指针类型成员
- 支持匿名结构,可用作成员或定义成员变量
- 匿名结构也可以用于map的值
- 可以使用字面值对结构进行初始化
- 允许直接通过指针来读写结构成员
- 相同类型的成员可进行直接拷贝赋值
- 支持 == 与 !=比较运算符,但不支持 > 或 <
- 支持匿名字段,本质上是定义了以某个类型名为名称的字段
- 嵌入结构作为匿名字段看起来像继承,但不是继承
- 可以使用匿名字段指针
package main
import "fmt"
type person struct {
Name string
Age int
}
func main() {
a := person{}
a.Name = "John"
a.Age = 19
fmt.Println(a)
}
package main
import "fmt"
type person struct {
Name string
Age int
}
func main() {
a := person{
Name:"Mark",
Age:20,
}
fmt.Println(a)
}
package main
import "fmt"
type person struct {
Name string
Age int
}
func main() {
a := person{
Name:"Mark",
Age:20,
}
fmt.Println(a)
A(a)
fmt.Println(a)
}
func A(per person){
per.Age=10
fmt.Println("A函数",per)
}
package main
import "fmt"
type person struct {
Name string
Age int
}
func main() {
a := &person{
Name: "Mark",
Age: 20,
}
a.Name = "George"
fmt.Println(a)
A(a)
fmt.Println(a)
}
func A(per *person) {
per.Age = 10
fmt.Println("A函数", per)
}
2 匿名结构
package main
import "fmt"
func main() {
a:= struct{
Name string
Age int
}{
Name:"Mark",
Age:20,
}
fmt.Println(a)
}
package main
import "fmt"
type person struct {
Name string
Age int
Contact struct {
Phone, City string
}
}
func main() {
a := person{
Name: "John",
Age: 18,
}
a.Contact.Phone = "1231414"
a.Contact.City = "NewYork"
fmt.Println(a)
}
3 匿名字段
package main
import "fmt"
type person struct {
string
int
}
func main() {
a := person{"John", 18}
var b person
b = a
fmt.Println(b)
}
3.2 “继承”
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() {
a := teacher{Name: "John", Age: 18, human:human{Sex:0}}
b := student{Name: "john", Age: 18, human:human{Sex:1}}
fmt.Println(a, b)
}
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() {
a := teacher{Name: "John", Age: 18, human:human{Sex:0}}
a.Name="Mark"
a.Age=20
a.Sex=100
fmt.Println(a)
}
3.3 匿名字段和外层字段有同名字段
package main
import "fmt"
type A struct{
B
Name string
}
type B struct{
Name string
}
func main() {
a:=A{Name:"A",B:B{Name:"B"}}
fmt.Println(a.Name,a.B.Name)
}