010.golang 结构struct

结构struct

  • Go 中的struct与C中的struct非常相似,并且Go没有class
  • 使用 type <Name> struct{} 定义结构,名称遵循可见性规则
  • 支持指向自身的指针类型成员
  • 支持匿名结构,可用作成员或定义成员变量
  • 匿名结构也可以用于map的值
  • 可以使用字面值对结构进行初始化
  • 允许直接通过指针来读写结构成员
  • 相同类型的成员可进行直接拷贝赋值
  • 支持 == 与 !=比较运算符,但不支持 > 或 <
  • 支持匿名字段,本质上是定义了以某个类型名为名称的字段
  • 嵌入结构作为匿名字段看起来像继承,但不是继承
  • 可以使用匿名字段指针

package main

import (
    "fmt"
)

type person struct {
    Name string
    Age  int
}

func main() {
    a := person{}
    a.Age = 19
    a.Name = "xiaoMing"

    fmt.Println(a)

    b := person{
        Name: "daMing", //别忘了加逗号
        Age:  20,       //别忘了加逗号
    }

    fmt.Println(b)
    b.Age = 23
    fmt.Println(b)

    updateAge(b)
    fmt.Println(b, "new")

    //通过指针传递可以进行深度修改
    updateOrigenAge(&b)
    fmt.Println(b, "new")

    //或者,创建结构的时候,前面加上取地址符号,参数就变成了指向结构的指针
    c := &person{
        Name: "laoWang", //别忘了加逗号
        Age:  58,        //别忘了加逗号
    }
    fmt.Println(c)
    //修改指针指向的某个属性,可以直接操作,不需要再取地址
    c.Name = "xiaoWang"
    updateOrigenAge(c)
    fmt.Println(c, "new")
}

func updateAge(b person) {
    b.Age = 3
    fmt.Println(b, "updateAge")
}

func updateOrigenAge(b *person) {
    b.Age = 5
    fmt.Println(b, "updateOrigenAge")
}

package main

import (
    "fmt"
)

type person struct {
    Name string
    Age  int
    //匿名结构
    Contact struct {
        Phone, City string
    }
}

func main() {
    //匿名结构
    a := struct {
        Name string
        Age  int
    }{
        Name: "xiaoMing",
        Age:  18,
    }

    fmt.Println(a)

    fmt.Println("----------------------")

    b := person{
        Name: "xiaoWang",
    }
    b.Age = 19
    b.Contact.City = "beiJing"
    b.Contact.Phone = "894401224"

    fmt.Println(b)
}

package main

import (
    "fmt"
)

type person struct {
    string
    int
}

func main() {
    //匿名属性时,声明并初始化时要严格按照属性类型顺序进行赋值
    a := person{"xiaoMing", 12}
    fmt.Println(a)
}

package main

import (
    "fmt"
)

type person struct {
    Name string
    Age  int
}

func main() {
    //只有同一结构的变量才可以进行判断是否相等
    //同一结构,各个属性相等,即为相等
    a := person{"xiaoMing", 12}
    b := person{"xiaoMing", 13}
    fmt.Println(b == a)
    b.Age = 12
    fmt.Println(b == a)
}

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() {
    //嵌入字段赋值:human: human{Sex: 0}
    a := teacher{Name: "laoMing", Age: 48, human: human{Sex: 0}}
    b := student{Name: "xiaoMing", Age: 18, human: human{Sex: 1}}
    fmt.Println("a", a)
    fmt.Println("b", b)

    a.Name = "laoWang"
    a.Age = 50
    a.human.Sex = 1
    fmt.Println("a", a)
}

package main

import (
    "fmt"
)

type human struct {
    Sex  int
    Name string
}

type student struct {
    //嵌入字段
    human
    Name string
    Age  int
}

func main() {
    //嵌入字段属性与外层属性字段相同时
    a := student{Name: "laoMing", Age: 48, human: human{Sex: 0, Name: "lao.Ming"}}
    b := student{Age: 18, human: human{Sex: 1, Name: "xiao.Ming"}}
    c := student{Name: "xiao.Ming", Age: 18, human: human{Sex: 1}}
    //获取Name
    fmt.Println("a.Name=", a.Name, "|", "a.human.Name=", a.human.Name)
    fmt.Println("b.Name=", b.Name, "|", "b.human.Name=", b.human.Name)
    fmt.Println("c.Name=", c.Name, "|", "c.human.Name=", c.human.Name)
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Go语言类型转换库【github.com/demdxx/gocast】的用法

一、导入库: go get github.com/demdxx/gocast 二、测试代码: // main.go package main import ( ...

2789
来自专栏Pythonista

Golang之struct

2182
来自专栏Pythonista

Golang之interface(多态,类型断言)

5113
来自专栏梦魇小栈

JQuery分析及实现part3之属性模块功能及实现

803
来自专栏Golang语言社区

Go语言编程中字符串切割方法小结

1.func Fields(s string) []string,这个函数的作用是按照1:n个空格来分割字符串最后返回的是 []string的切片 import...

3769
来自专栏菩提树下的杨过

Effective java 第2版 - 笔记(01) 单例(Singleton)的枚举(enum)实现

直接上代码: 1 public enum Boss { 2 3 INSTANCE; 4 5 private String name...

20710
来自专栏吴伟祥

java解析任意层的json数据(递归解析) 原

1571
来自专栏coder修行路

Go基础之--排序和查找操作

排序操作主要都在sort包中,导入就可以使用了 import("sort") 常用的操作 sort.Ints:对整数进行排序 sort.Strings:对字符串...

3399
来自专栏老马寒门IT

04-老马jQuery教程-DOM节点操作及位置和大小

1. jQuery创建DOM标签 1.1 DOM动态创建标签的方法 DOM时代我们通过document的createElement方法动态创建标签。创建标签后,...

2289
来自专栏Golang语言社区

浅谈Go语言中的结构体struct &amp; 接口Interface &amp; 反射

结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套;

2124

扫码关注云+社区

领取腾讯云代金券