Go struct

Go 语言中,也和 C 或者其他语言一样,我们可以声明新的类型,作为其它类型的属性或字段的容器。例如,我们可以创建一个自定义类型 person 代表一个人的实体。这个实体拥有属性:姓名和年龄。这样的类型我们称之

type person struct {
    name string
    age int
}
  • 一个 string 类型的字段 name,用来保存用户名称这个属性
  • 一个 int 类型的字段 age, 用来保存用户年龄这个属性
package main

import "fmt"

type person struct {
    name string
    age int
}

func older (p1, p2 person) (person , int){
    if p1.age > p2.age {
        return p1, p1.age-p2.age
    }
    return p2, p2.age-p1.age
}

func main() {

    // var P person

    // P.name =  "Lisen"
    // P.age = 25

    // P := person{"Tom", 25}
    // P := person{age:24, name:"Tom"}

    // fmt.Printf("The person's name is %s\n", P.name)
    var tom person
    paul := person{"Paul", 34}
    bob := person{age:25, name:"Bob"}
    tom.name, tom.age = "Tom", 18

    tb_max, tb_diff := older(tom, bob)
    tp_max, tp_diff := older(tom, paul)
    bp_max, bp_diff := older(bob, paul)

    fmt.Printf("Of %s and %s, %s is older by %d years\n",
        tom.name, bob.name, tb_max.name, tb_diff)

    fmt.Printf("Of %s and %s, %s is older by %d years\n",
        tom.name, paul.name, tp_max.name, tp_diff)

    fmt.Printf("Of %s and %s, %s is older by %d years\n",
        bob.name, paul.name, bp_max.name, bp_diff)
}

struct的匿名字段

我们上面介绍了如何定义一个struct,定义的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段。

当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct。

让我们来看一个例子,让上面说的这些更具体化

package main

import "fmt"

type Skills []string

type Human struct {
    name string
    age int
    weight int
}

type Student struct {
    Human 
    Skills
    speciality string
    
}

func main() {
    mark :=  Student{Human:Human{"Jhone", 23, 112}, speciality:"Waist drum"}
    
    fmt.Println("His name is ", mark.name)
    fmt.Println("His age is ", mark.age)
    fmt.Println("His weight is ", mark.weight)
    fmt.Println("His speciality is ", mark.speciality)    // 修改对应的备注信息
    mark.Skills = []string{"anatomy"}
    mark.Skills = append(mark.Skills, "physics", "golang")
    fmt.Println("Her skills are ", mark.Skills)

    mark.speciality = "AI"
    fmt.Println("Jhone changed his speciality")
    fmt.Println("His speciality is ", mark.speciality)
    



}

 

posted @ 2020-07-21 16:45  红领巾下的大刀疤  阅读(115)  评论(0)    收藏  举报
/* 看板娘 */