谈一谈Go的结构体struct的使用方法

来源:互联网 发布:中国股市周期 知乎 编辑:程序博客网 时间:2024/06/05 13:44

定义结构体

package mainimport (    "fmt")type test struct {}func main() {    a := test{}    fmt.Println(a)}

输出:

{}


package mainimport (    "fmt")//定义一个person结构,类似于在PHP定义了一个person的classtype Person struct {    name string //默认零值为空字符串    age  int    //默认零值为0}func main() {    a := Person{}    fmt.Println(a)}

输出:

{ 0}


访问结构体成员

package mainimport (    "fmt")//定义一个person结构,类似于在PHP定义了一个person的classtype Person struct {    name string //默认零值为空字符串    age  int    //默认零值为0}func main() {    a := Person{}    //对Person进行属性操作,类似于javascript的操作    a.name = "GO"    a.age = 8    fmt.Println(a)}

输出:

{GO 8}


字面量初始化

package mainimport (    "fmt")//定义一个person结构,类似于在PHP定义了一个person的classtype Person struct {    name string //默认零值为空字符串    age  int    //默认零值为0}func main() {    //也可以通过字面值进行初始化,这是常用的做法,写法类似于JSON的写法    a := Person{        name: "GO",        age:  8} //注意,如果没有逗号,则}不能另起新行,否则会报错    fmt.Println(a)}

输出:

{GO 8}


结构体作为参数传递

package mainimport (    "fmt")//定义一个person结构,类似于在PHP定义了一个person的classtype person struct {    name string //默认零值为空字符串    age  int    //默认零值为0}func main() {    //也可以通过字面值进行初始化,这是常用的做法,写法类似于JSON的写法 ,注意属性名不能加分号    a := person{        name: "GO",        age:  8} //注意,如果没有逗号,则}不能另起新行,否则会报错    fmt.Println("我在A前面输出", a)    A(a) //A(&a)就是值传递,A函数应写成func A(per *person)    fmt.Println("我在A后面输出", a)//很显然,A里面的赋值并没有改变a的值,证明结构是值类型,传值是值拷贝}//结构也是值类型,传值的时候也是值拷贝func A(per person) { //传递per参数,类型为person结构    per.name = "PHP"    fmt.Println("我在A里面输出", per)}


输出:

  我在A前面输出 {GO 8}
  我在A里面输出 {PHP 8}
  我在A后面输出 {GO 8}


结构体指针

package mainimport (    "fmt")//定义一个person结构,类似于在PHP定义了一个person的classtype person struct {    name string //默认零值为空字符串    age  int    //默认零值为0}func main() {    //如何传递指针    a := &person{ //变量初始化时,加&取地址        name: "GO",        age:  8} //注意,如果没有逗号,则}不能另起新行,否则会报错    //当传地址的时候,想操作属性时,Go语言可以不需要加*,直接操作    a.age = 9    fmt.Println("我在A前面输出", a)    A(a)    fmt.Println("我在A后面输出", a) //很显然,A里面的赋值并没有改变a的值,证明结构是值类型,传值是值拷贝}//结构也是值类型,传值的时候也是值拷贝func A(per *person) { //此时为指针类型    per.name = "PHP"    fmt.Println("我在A里面输出", per)}

输出:

  我在A前面输出 &{GO 9}
  我在A里面输出 &{PHP 9}
  我在A后面输出 &{PHP 9}

匿名结构体

package mainimport (    "fmt")//匿名结构func main() {    a := &struct {        name string        age  int    }{        name: "PHP",        age:  10,    }    fmt.Println(a) //很显然,A里面的赋值并没有改变a的值,证明结构是值类型,传值是值拷贝}

输出:

&{PHP 10}


结构体的嵌套

package mainimport (    "fmt")//结构嵌套type person struct {    name    string    age     int    contact struct {        phone, city string    }}func main() {    a := person{name: "GO", age: 8}    a.contact.phone = "1112345678"    a.contact.city = "福州"    fmt.Println(a)}

输出:

{GO 8 {1112345678 福州}}


结构体匿名字段

package mainimport (    "fmt")//匿名字段type person struct {    string    int}func main() {    a := person{"GO", 8} //注意这里的位置不能对调,应与声明的顺序一样    fmt.Println(a)}

输出:

{GO 8}


结构体之间的比较(不同结构,没有可比性,会报错,哪怕属性值和属性都一样)

package mainimport (    "fmt")//匿名字段type person struct {    string    int}type person1 struct {    string    int}func main() {    a := person{"GO", 8} //属性person结构    b := person1{"GO", 8}//属于person1结构              fmt.Println(a == b)}

输出报错
.\hello.go:21:16: invalid operation: a == b (mismatched types person and person1)

结构体之间的赋值

package mainimport (    "fmt")//匿名字段type person struct {    string    int}func main() {    a := person{"GO", 8}    b := a    fmt.Println(a, b)}

输出:

{GO 8} {GO 8}


结构体之间的“继承“(注意:Go并没有面向对象语言的继承关系,如PHP)

package mainimport (    "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: "PHP", age: 15}    b := student{name: "GO", age: 8}    fmt.Println(a, b)}

输出:
  {{0} PHP 15} {{0} GO 8}

嵌入结构体的使用方法

package mainimport (    "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: "PHP", age: 15, human: human{sex: 0}} //嵌入结构作为匿名字段时,默认字段名就是嵌入的结果名    b := student{name: "GO", age: 8, human: human{sex: 1}}    fmt.Println(a, b)}

输出:
{{0} PHP 15} {{1} GO 8}

嵌入结构体如何修改相关属性
package mainimport (    "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: "PHP", age: 15, human: human{sex: 0}} //嵌入结构作为匿名字段时,默认字段名就是嵌入的结果名    b := student{name: "GO", age: 8, human: human{sex: 1}}    a.name = "PYTHON"    b.sex = 0 //如果是嵌入结构,则把原来的字段全部拷贝过来到现在的结构里了,操作字段时无需写成b.human.sex    fmt.Println(a, b)}

输出:
{{0} PYTHON 15} {{0} GO 8}



原创粉丝点击