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

定义结构体

package main

import (
    "fmt"
)

type test struct {
}

func main() {
    a := test{}
    fmt.Println(a)
}

输出:

{}


package main

import (
    "fmt"
)

//定义一个person结构,类似于在PHP定义了一个person的class
type Person struct {
    name string //默认零值为空字符串
    age  int    //默认零值为0
}

func main() {
    a := Person{}
    fmt.Println(a)
}

输出:

{ 0}


访问结构体成员

package main

import (
    "fmt"
)

//定义一个person结构,类似于在PHP定义了一个person的class
type 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 main

import (
    "fmt"
)

//定义一个person结构,类似于在PHP定义了一个person的class
type Person struct {
    name string //默认零值为空字符串
    age  int    //默认零值为0
}

func main() {
    //也可以通过字面值进行初始化,这是常用的做法,写法类似于JSON的写法
    a := Person{
        name: "GO",
        age:  8} //注意,如果没有逗号,则}不能另起新行,否则会报错
    fmt.Println(a)
}

输出:

{GO 8}


结构体作为参数传递

package main

import (
    "fmt"
)

//定义一个person结构,类似于在PHP定义了一个person的class
type 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 main

import (
    "fmt"
)

//定义一个person结构,类似于在PHP定义了一个person的class
type 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 main

import (
    "fmt"
)

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

输出:

&{PHP 10}


结构体的嵌套

package main

import (
    "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 main

import (
    "fmt"
)

//匿名字段
type person struct {
    string
    int
}

func main() {
    a := person{"GO", 8} //注意这里的位置不能对调,应与声明的顺序一样
    fmt.Println(a)
}

输出:

{GO 8}


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

package main

import (
    "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 main

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

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

嵌入结构体的使用方法

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: "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 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: "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}



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值