1. package main
    2. import "fmt"
    3. //自定义类型
    4. type myInt int
    5. // type myFn func(int, int) int
    6. //类型别名
    7. type myFloat = float64
    8. func main() {
    9. var a myInt = 10
    10. fmt.Printf("%v %T\n", a, a) //10 main.myInt
    11. var b myFloat = 12.3
    12. fmt.Printf("%v %T", b, b) //12.3 float64
    13. }
    1. /*
    2. Go语言中的基础数据类型可以表示一些事物的基本属性,
    3. 但是当我们想表达一个事物的全部或部分属性时,
    4. 这时候再用单一的基本数据类型明显就无法满足需求了,
    5. Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,
    6. 这种数据类型叫结构体,英文名称struct
    7. */
    8. package main
    9. import "fmt"
    10. type Person struct {
    11. name string
    12. age int
    13. sex string
    14. }
    15. func main() {
    16. var p1 Person //实例化Person结构体
    17. p1.name = "张三"
    18. p1.sex = "男"
    19. p1.age = 20
    20. fmt.Printf("值:%v 类型:%T\n", p1, p1) //值:{张三 20 男} 类型:main.Person
    21. fmt.Printf("值:%#v 类型:%T", p1, p1) //值:main.Person{name:"张三", age:20, sex:"男"} 类型:main.Person
    22. }
    1. /*
    2. Go语言中的基础数据类型可以表示一些事物的基本属性,
    3. 但是当我们想表达一个事物的全部或部分属性时,
    4. 这时候再用单一的基本数据类型明显就无法满足需求了,
    5. Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,
    6. 这种数据类型叫结构体,英文名称struct
    7. 注意:结构体首字母可以大写也可以小写,大写表示这个结构体是公有的,在其他的包里面 可以使用。小写表示这个结构体是私有的,只有这个包里面才能使用
    8. */
    9. package main
    10. import "fmt"
    11. type Person struct {
    12. Name string
    13. Age int
    14. Sex string
    15. }
    16. func main() {
    17. //注意:在 Golang 中支持对结构体指针直接使用.来访问结构体的成员。p2.name = "张三" 其 实在底层是(*p2).name = "张三"
    18. var p2 = new(Person)
    19. p2.Name = "李四"
    20. p2.Age = 20
    21. p2.Sex = "男"
    22. (*p2).Name = "王五"
    23. fmt.Printf("值:%#v 类型:%T\n", p2, p2) //值:&main.Person{Name:"李四", Age:20, Sex:"男"} 类型:*main.Person
    24. var p3 = &Person{}
    25. p3.Name = "赵四"
    26. p3.Age = 23
    27. p3.Sex = "男"
    28. fmt.Printf("值:%#v 类型:%T\n", p3, p3) //值:&main.Person{Name:"赵四", Age:23, Sex:"男"} 类型:*main.Person
    29. var p4 = Person{
    30. Name: "哈哈",
    31. Age: 20,
    32. Sex: "男",
    33. }
    34. fmt.Printf("值:%#v 类型:%T\n", p4, p4) //值:main.Person{Name:"哈哈", Age:20, Sex:"男"} 类型:main.Person
    35. var p5 = &Person{
    36. Name: "王麻子",
    37. Age: 20,
    38. Sex: "男",
    39. }
    40. fmt.Printf("值:%#v 类型:%T\n", p5, p5) //值:&main.Person{Name:"王麻子", Age:20, Sex:"男"} 类型:*main.Person
    41. var p6 = &Person{
    42. Name: "王麻子",
    43. }
    44. fmt.Printf("值:%#v 类型:%T\n", p6, p6) //值:&main.Person{Name:"王麻子", Age:0, Sex:""} 类型:*main.Person
    45. var p7 = &Person{
    46. "张三",
    47. 20,
    48. "男",
    49. }
    50. fmt.Printf("值:%#v 类型:%T\n", p7, p7) //值:&main.Person{Name:"张三", Age:20, Sex:"男"} 类型:*main.Person
    51. }
    1. /*
    2. 值类型 : 改变变量副本值的时候,不会改变变量本身的值 (数组、基本数据类型、结构体)
    3. 引用类型:改变变量副本值的时候,会改变变量本身的值 (切片、map)
    4. */
    5. package main
    6. import "fmt"
    7. type Person struct {
    8. Name string
    9. Age int
    10. Sex string
    11. }
    12. func main() {
    13. var p1 = Person{
    14. Name: "哈哈",
    15. Age: 20,
    16. Sex: "男",
    17. }
    18. p2 := p1
    19. p2.Name = "李四"
    20. fmt.Printf("%#v\n", p1) //main.Person{Name:"哈哈", Age:20, Sex:"男"}
    21. fmt.Printf("%#v", p2) //main.Person{Name:"李四", Age:20, Sex:"男"}
    22. }
    1. /*
    2. 结构体可以描述现实生活中的任何事物,生活中的任何事物都可以当做结构体对象
    3. 我们可以把客观事物封装成结构体 :
    4. 汽车
    5. 汽车有属性:颜色 大小 重量 发动机 轮胎 ...
    6. 汽车行为 也叫方法: run 跑
    7. 小狗
    8. 属性:颜色 大小 品种 性别 ..
    9. 行为:叫 、闻一闻 舔一舔 咬一咬
    10. 电风扇
    11. 属性: 颜色 大小 高低...
    12. 行为:转动
    13. 人也是一个结构体对象:
    14. 属性: 名字 年龄 性别 ...
    15. 行为:工作 运动 ..
    16. */
    17. package main
    18. import "fmt"
    19. type Person struct {
    20. Name string
    21. Age int
    22. Sex string
    23. height int
    24. }
    25. func (p Person) PrintInfo() {
    26. fmt.Printf("姓名:%v 年龄:%v\n", p.Name, p.Age)
    27. }
    28. func main() {
    29. var p1 = Person{
    30. Name: "张三",
    31. Age: 20,
    32. Sex: "男",
    33. }
    34. p1.PrintInfo() //姓名:张三 年龄:20
    35. var p2 = Person{
    36. Name: "李四",
    37. Age: 30,
    38. Sex: "男",
    39. }
    40. p2.PrintInfo() //姓名:李四 年龄:30
    41. p1.PrintInfo() //姓名:张三 年龄:20
    42. }
    1. /*
    2. 结构体可以描述现实生活中的任何事物,生活中的任何事物都可以当做结构体对象
    3. 我们可以把客观事物封装成结构体 :
    4. 汽车
    5. 汽车有属性:颜色 大小 重量 发动机 轮胎 ...
    6. 汽车行为 也叫方法: run 跑
    7. 小狗
    8. 属性:颜色 大小 品种 性别 ..
    9. 行为:叫 、闻一闻 舔一舔 咬一咬
    10. 电风扇
    11. 属性: 颜色 大小 高低...
    12. 行为:转动
    13. 人也是一个结构体对象:
    14. 属性: 名字 年龄 性别 ...
    15. 行为:工作 运动 ..
    16. */
    17. package main
    18. import "fmt"
    19. type Person struct {
    20. Name string
    21. Age int
    22. Sex string
    23. height int
    24. }
    25. func (p Person) PrintInfo() {
    26. fmt.Printf("姓名:%v 年龄:%v\n", p.Name, p.Age)
    27. }
    28. func (p *Person) SetInfo(name string, age int) {
    29. p.Name = name
    30. p.Age = age
    31. }
    32. func main() {
    33. var p1 = Person{
    34. Name: "张三",
    35. Age: 20,
    36. Sex: "男",
    37. }
    38. p1.PrintInfo() //姓名:张三 年龄:20
    39. p1.SetInfo("李四", 34)
    40. p1.PrintInfo() //姓名:李四 年龄:34
    41. }
    1. /*
    2. 结构体可以描述现实生活中的任何事物,生活中的任何事物都可以当做结构体对象
    3. 我们可以把客观事物封装成结构体 :
    4. 汽车
    5. 汽车有属性:颜色 大小 重量 发动机 轮胎 ...
    6. 汽车行为 也叫方法: run 跑
    7. 小狗
    8. 属性:颜色 大小 品种 性别 ..
    9. 行为:叫 、闻一闻 舔一舔 咬一咬
    10. 电风扇
    11. 属性: 颜色 大小 高低...
    12. 行为:转动
    13. 人也是一个结构体对象:
    14. 属性: 名字 年龄 性别 ...
    15. 行为:工作 运动 ..
    16. */
    17. //golang中结构体实例是独立的,不会相互影响
    18. package main
    19. import "fmt"
    20. type Person struct {
    21. Name string
    22. Age int
    23. Sex string
    24. height int
    25. }
    26. func (p Person) PrintInfo() {
    27. fmt.Printf("姓名:%v 年龄:%v\n", p.Name, p.Age)
    28. }
    29. func (p *Person) SetInfo(name string, age int) {
    30. p.Name = name
    31. p.Age = age
    32. }
    33. func main() {
    34. var p1 = Person{
    35. Name: "张三",
    36. Age: 20,
    37. Sex: "男",
    38. }
    39. p1.PrintInfo() //姓名:张三 年龄:20
    40. var p2 = Person{
    41. Name: "王五",
    42. Age: 22,
    43. Sex: "男",
    44. }
    45. p1.SetInfo("李四", 34)
    46. p1.PrintInfo() //姓名:李四 年龄:34
    47. p2.PrintInfo() //姓名:王五 年龄:22
    48. }
    1. package main
    2. import "fmt"
    3. //注意事项: 非本地类型不能定义方法,也就是说我们不能给别的包的类型定义方法。
    4. type MyInt int
    5. func (m MyInt) PrintInfo() {
    6. fmt.Println("我是自定义类型里面的自定义方法")
    7. }
    8. func main() {
    9. var a MyInt = 20
    10. a.PrintInfo()
    11. }
    1. package main
    2. import "fmt"
    3. /*
    4. 结构体的匿名字段:
    5. 结构体允许其成员字段在声明时没有字段名而只有类型,这种没有名字的字段就称为匿名字段
    6. 匿名字段默认采用类型名作为字段名,结构体要求字段名称必须唯一,因此一个结构体中同种类型的匿名字段只能有一个
    7. */
    8. type Person struct {
    9. string
    10. int
    11. }
    12. func main() {
    13. p := Person{
    14. "张三",
    15. 20,
    16. }
    17. fmt.Println(p)
    18. }
    1. package main
    2. import "fmt"
    3. /*
    4. 结构体的字段类型可以是:基本数据类型、也可以是切片、Map 以及结构体
    5. 如果结构体的字段类型是: 指针,slice,和map的零值都是 nil ,即还没有分配空间
    6. 如果需要使用这样的字段,需要先make,才能使用.
    7. */
    8. type Person struct {
    9. Name string
    10. Age int
    11. Hobby []string
    12. map1 map[string]string
    13. }
    14. func main() {
    15. var p Person
    16. p.Name = "张三"
    17. p.Age = 20
    18. p.Hobby = make([]string, 3, 6)
    19. p.Hobby[0] = "写代码"
    20. p.Hobby[1] = "打篮球"
    21. p.Hobby[2] = "睡觉"
    22. p.map1 = make(map[string]string)
    23. p.map1["address"] = "北京"
    24. p.map1["phone"] = "1324325325"
    25. fmt.Printf("%#v\n", p)
    26. fmt.Printf("%v", p.Hobby)
    27. }
    1. package main
    2. import "fmt"
    3. /*
    4. 结构体嵌套
    5. */
    6. type User struct {
    7. Username string
    8. Password string
    9. Address Address //表示User结构体嵌套Address结构体
    10. }
    11. type Address struct {
    12. Name string
    13. Phone string
    14. City string
    15. }
    16. func main() {
    17. var u User
    18. u.Username = "itying"
    19. u.Password = "1234567"
    20. u.Address.Name = "张三"
    21. u.Address.Phone = "15201671234"
    22. u.Address.City = "北京"
    23. fmt.Printf("%#v", u) //main.User{Username:"itying", Password:"1234567", Address:main.Address{Name:"张三", Phone:"15201671234", City:"北京"}}
    24. }
    1. package main
    2. import "fmt"
    3. /*
    4. 嵌套匿名结构体
    5. */
    6. type User struct {
    7. Username string
    8. Password string
    9. Address
    10. }
    11. type Address struct {
    12. Name string
    13. Phone string
    14. City string
    15. }
    16. func main() {
    17. var u User
    18. u.Username = "itying"
    19. u.Password = "1234567"
    20. u.Address.Name = "张三"
    21. u.Address.Phone = "15201671234"
    22. u.Address.City = "北京"
    23. u.City = "上海" //当访问结构体成员时会先在结构体中查找该字段,找不到再去匿名结构体中查找。
    24. fmt.Printf("%#v\n", u) //main.User{Username:"itying", Password:"1234567", Address:main.Address{Name:"张三", Phone:"15201671234", City:"上海"}}
    25. fmt.Println(u.Address.Phone)
    26. fmt.Println(u.Phone)
    27. }
    1. package main
    2. import "fmt"
    3. /*
    4. 嵌套匿名结构体
    5. */
    6. type User struct {
    7. Username string
    8. Password string
    9. AddTime string
    10. Address
    11. }
    12. type Address struct {
    13. Name string
    14. Phone string
    15. City string
    16. AddTime string
    17. }
    18. func main() {
    19. var u User
    20. u.Username = "itying"
    21. u.Password = "1234567"
    22. u.Address.Name = "张三"
    23. u.Address.Phone = "15201671234"
    24. u.Address.City = "北京"
    25. u.City = "上海" //当访问结构体成员时会先在结构体中查找该字段,找不到再去匿名结构体中查找。
    26. u.AddTime = "2020-05-1"
    27. u.Address.AddTime = "2020-06-1"
    28. fmt.Printf("%#v\n", u)
    29. }
    1. package main
    2. import "fmt"
    3. /*
    4. 关于嵌套结构体的字段名冲突
    5. */
    6. type User struct {
    7. Username string
    8. Password string
    9. Address
    10. Email
    11. }
    12. type Address struct {
    13. Name string
    14. Phone string
    15. City string
    16. AddTime string
    17. }
    18. type Email struct {
    19. Account string
    20. AddTime string
    21. }
    22. func main() {
    23. var u User
    24. u.Username = "itying"
    25. u.Password = "1234567"
    26. u.Address.Name = "张三"
    27. u.Address.Phone = "15201671234"
    28. u.Address.City = "北京"
    29. u.City = "上海" //当访问结构体成员时会先在结构体中查找该字段,找不到再去匿名结构体中查找。
    30. u.Address.AddTime = "2020-05-1"
    31. u.Email.AddTime = "2020-06-1"
    32. fmt.Printf("%#v\n", u)
    33. }
    1. package main
    2. import "fmt"
    3. //父亲结构体
    4. type Animal struct {
    5. Name string
    6. }
    7. func (a Animal) run() {
    8. fmt.Printf("%v 在运动\n", a.Name)
    9. }
    10. //子结构体
    11. type Dog struct {
    12. Age int
    13. Animal //结构体嵌套 继承
    14. }
    15. func (d Dog) wang() {
    16. fmt.Printf("%v 在旺旺\n", d.Name)
    17. }
    18. func main() {
    19. var d = Dog{
    20. Age: 20,
    21. Animal: Animal{
    22. Name: "阿奇",
    23. },
    24. }
    25. d.run()
    26. d.wang()
    27. }
    1. package main
    2. import "fmt"
    3. //一个结构体中可以嵌套包含另一个结构体或结构体指针
    4. //父亲结构体
    5. type Animal struct {
    6. Name string
    7. }
    8. func (a Animal) run() {
    9. fmt.Printf("%v 在运动\n", a.Name)
    10. }
    11. //子结构体
    12. type Dog struct {
    13. Age int
    14. *Animal //结构体嵌套 继承
    15. }
    16. func (d Dog) wang() {
    17. fmt.Printf("%v 在旺旺\n", d.Name)
    18. }
    19. func main() {
    20. var d = Dog{
    21. Age: 20,
    22. Animal: &Animal{
    23. Name: "阿奇",
    24. },
    25. }
    26. d.run()
    27. d.wang()
    28. }