main.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package main
  2. import "fmt"
  3. // 1. 定义结构体类型:把不同类型的相关数据组合在一起。
  4. // type 表示定义类型,Student 是类型名,Name / Age / Score 是字段。
  5. type Student struct {
  6. Name string
  7. Age int
  8. Score float64
  9. }
  10. // 2. 结构体也可以作为普通函数的参数。
  11. // 这里传入的是 Student 值的副本;本函数只读取它。
  12. func printStudent(student Student) {
  13. fmt.Printf("姓名:%s,年龄:%d,成绩:%.1f\n", student.Name, student.Age, student.Score)
  14. }
  15. func main() {
  16. // 3. 使用字段名初始化。多行写法的最后一个字段也需要逗号。
  17. fmt.Println("=== 创建与访问字段 ===")
  18. student := Student{
  19. Name: "小朱",
  20. Age: 20,
  21. Score: 90.5,
  22. }
  23. printStudent(student)
  24. student.Age = 21
  25. fmt.Printf("修改后的年龄:%d\n", student.Age)
  26. // 4. 没有显式赋值的字段会得到各自类型的零值。
  27. fmt.Println("\n=== 结构体零值 ===")
  28. var empty Student
  29. fmt.Printf("姓名:%q,年龄:%d,成绩:%.1f\n", empty.Name, empty.Age, empty.Score)
  30. // 5. 本课结构体只包含 string / int / float64,赋值后修改副本不影响原值。
  31. fmt.Println("\n=== 结构体赋值 ===")
  32. copied := student
  33. copied.Name = "小李"
  34. fmt.Printf("原姓名:%s,副本姓名:%s\n", student.Name, copied.Name)
  35. // 6. []Student 是结构体切片,每个元素保存一名学生的信息。
  36. fmt.Println("\n=== 结构体切片 ===")
  37. students := []Student{
  38. {Name: "小朱", Age: 21, Score: 90.5},
  39. {Name: "小李", Age: 19, Score: 80},
  40. {Name: "小陈", Age: 22, Score: 75.5},
  41. }
  42. total := 0.0
  43. for _, item := range students {
  44. printStudent(item)
  45. total += item.Score
  46. }
  47. fmt.Printf("总分:%.1f,平均分:%.2f\n", total, total/float64(len(students)))
  48. // 7. range 得到的 item 是元素副本。要修改原元素,使用索引。
  49. for index := range students {
  50. students[index].Age++
  51. }
  52. fmt.Printf("所有学生年龄加一后,第一位年龄:%d\n", students[0].Age)
  53. // 8. 不单独起类型名的结构体切片:对应上一课测试中的 []struct。
  54. // 本课先把它当作“由多条记录组成的表”,只用普通循环读取。
  55. fmt.Println("\n=== 理解测试数据表 ===")
  56. tests := []struct {
  57. name string
  58. a int
  59. b int
  60. want int
  61. }{
  62. {name: "正数相加", a: 2, b: 3, want: 5},
  63. {name: "正负相加", a: -2, b: 3, want: 1},
  64. }
  65. for _, tt := range tests {
  66. got := tt.a + tt.b
  67. fmt.Printf("%s:实际=%d,期望=%d,通过=%t\n", tt.name, got, tt.want, got == tt.want)
  68. }
  69. }