当前位置: 首页 > news >正文

Go 语言之 struct 结构体

struct 结构


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

测试用例

//
package main

import "fmt"

//定义了一 个空的结构体
type st01 struct {
}

//定义一个非空的结构体
type person struct {
    Name string
    Age  int
}

func main() {
    personInfo := person{}
    personInfo.Age = 19
    personInfo.Name = "xiaoqiang"

    fmt.Println(personInfo)

    //------------------------------
    fmt.Println("=============================")
    //直接初始化   属于 字面值 初始化
    personInfo2 := person{Name :"spark01", Age: 19}
    fmt.Println(personInfo2)

}

结构体,按值传递

//结构体,按值 传递
package main

import "fmt"

//定义一个类型
type sparkInfo struct {
    SparkClusterName string
    SparkNodeNum     int
}

func main() {
    newSparkInfo := sparkInfo{
        SparkNodeNum:     8,
        SparkClusterName: "spark-test-001"}

    fmt.Println("main:\t", newSparkInfo)
    updateSparkInfo(newSparkInfo)
    fmt.Println("main:\t", newSparkInfo)

}

//同样,这里是值传递,内部的修改,并不会影响到 旧值的
func updateSparkInfo(sparkInfo sparkInfo) {
    sparkInfo.SparkNodeNum = 9
    fmt.Println("updateSparkInfo:\t", sparkInfo)
}

结构体,按地址传递

//结构体,按地址传递
package main

import "fmt"

type k8sInfo struct {
    K8sClusterName string //k8s集群的名称
    K8sClusterNumm int    //k8s集群的节点个数
}

func main() {
    k8sInfo := k8sInfo{
        K8sClusterNumm: 1,
        K8sClusterName: "k8s-test-001"}

    fmt.Println(k8sInfo)
    updateK8sClusterInfo(&k8sInfo)
    fmt.Println(k8sInfo)
}

//传递的是 地址,按地址传递
//修改了,旧的值
func updateK8sClusterInfo(info *k8sInfo) {
    info.K8sClusterNumm = 110

    fmt.Println("updateK8s:\t", info)
}

结构体,按地址传递

//结构体,按地址传递
package main

import "fmt"

type dockerInfo struct {
    DockerClusterName string
    DockerClusterNum int
}

func main() {
    //一般更习惯这种写法,
    //在初始化的时候,就直接获取地址
    //这样以后在调用的时候,就不需要添加&号了
    dInfo := &dockerInfo{
        DockerClusterNum:19,
        DockerClusterName:"docker-yizhuang"}

    fmt.Println("init docker:\t", dInfo)
    updateDockerInfo(dInfo)
    fmt.Println("after docker:\t", *dInfo)

}

func updateDockerInfo (info *dockerInfo) {
    info.DockerClusterNum = 80
    fmt.Println("udpateDocker:\t", info)
}

匿名结构

//匿名结构
package main

import "fmt"

func main() {

    //创建一个匿名结构,
    //并且进行了初始化
    //而且,直接获取地址&
    ftp := &struct {
        FtpName string
        FtpNum int
    }{
        FtpName:"ftp-beijing",
        FtpNum:8}

    fmt.Println(ftp)
    fmt.Println(*ftp)
    fmt.Println("FtpName:\t", ftp.FtpName)
    fmt.Println("FtpNum:\t", ftp.FtpNum)

}

匿名结构, 嵌套进别的结构体里

//将匿名结构,嵌套进别的结构体里
package main

import "fmt"

type hadoop struct {
    HadoopClusterName string
    HadoopClusterNum  int
    //创建一个匿名结构
    HadoopOtherInfo struct {
        //同样,当多个变量都一样的时候,也可用省略
        //这是Go语言的优点
        HadoopVersion, HadoopUrl string
    }
}

func main() {
    hdfs := &hadoop{
        HadoopClusterName: "Hadoop-test-001",
        HadoopClusterNum:  9}

    //只能通过这种方式,进行初始化
    hdfs.HadoopOtherInfo.HadoopUrl = "http://192.168.1.110:50070"
    hdfs.HadoopOtherInfo.HadoopVersion = "v2.7.0"

    fmt.Println(hdfs)
    fmt.Println(*hdfs)
    fmt.Println("HadoopClusterName:\t", hdfs.HadoopClusterName)
    fmt.Println("HadoopClusterNum:\t", hdfs.HadoopClusterNum)
    fmt.Println("HadoopClusterVersion:\t", hdfs.HadoopOtherInfo.HadoopVersion)
    fmt.Println("HadoopClusterUrl:\t", hdfs.HadoopOtherInfo.HadoopUrl)

}

匿名字段

//匿名字段  测试
package main

import "fmt"

type students struct {
    //这些就是匿名字段,没有定义名字
    string
    int
}

func main() {
    boy := &students{
        //初始化的时候,必须按照顺序来进行的
        "xiaoqiang", 19}
    fmt.Println(boy)
}

相同结构体 之间 操作,如赋值,比较

// 相同结构体  之间 操作,如赋值,比较
package main

import "fmt"

type teacherA struct {
    string
    int
}
 type teacherB struct {
    string
    int
 }

func main() {

    boyTeacherA := teacherA{"xiaoli",22}
    //boyTeacherB := teacherB{"xiaoli",22}
    //説明:编译报错了,teacherA, teacherB  类型不相同,不能进行比较的
    //fmt.Println(boyTeacherA == boyTeacherB)

    boyTeacherB := teacherA{"xiaoli", 23}
    fmt.Println(boyTeacherB == boyTeacherA)

}

结构体,实现 类似于 继承的效果

//结构体,实现 类似于 继承的效果
package main

import "fmt"

type anminal struct {
    //设置一些共有的属性
    Name, address string
}

type cat struct {
    //anminal  Go 语言,默认,anminal是类型,同时也是属性名称
    anminal
    Sex int         // 猫的特有属性,性别是啥
}

type dog struct {
    anminal
    Hobby string  //狗的特有属性,爱好
}

func main() {
    //第一种初始化方式
    xiaoCat := cat{Sex:0, anminal : anminal{Name:"xiaohong", address:"beijing"}}
    xiaoDog := dog{Hobby:"play", anminal:anminal{Name:"xiaohuang", address:"shanghai"}}

    //第二种初始化方式
    xiaoCat.anminal.Name = "xiaoxiaoxiaohong" //这种方式,是为了防止名字相同时,冲突
    xiaoCat.Name = "xiaoxiaohong"

    fmt.Println("cat:\t", xiaoCat)
    fmt.Println("dog:\t",xiaoDog)

}

struct里含有匿名函数

package main

import "fmt"

type annimal2 struct {
    name string

    // 这种形式,也是可以的
    //有点类似于接口中定义方法
    show func()
}

func main() {
dog := annimal2{name:"xiaohuang",
        show: func() {
            fmt.Println("this is xiaohuang")
        },
    }

    dog.show()

    cat:= annimal2{name:"xiaohong",
        show: func() {
            fmt.Println("this is xiaohong")
        },
    }

    cat.show()

}

运行结果:

this is xiaohuang
this is xiaohong

Process finished with exit code 0

转载于:https://blog.51cto.com/xingej/2103044

相关文章:

  • 安卓设置背景图平铺,同时设置背景色
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 为用户管理连接 Confluence 6 到 Jira 应用程序
  • 加密算法:DigestUtils与java MessageDigest
  • Spring Extensible XML
  • mooc-IDEA alter enter--008
  • 20172318 2017-2018-2 《程序设计与数据结构》第6周学习总结
  • 坚持不走寻常路 解读“锐捷式”创新的三个突破
  • Java基础-正则表达式(Regular Expression)语法规则简介
  • 你不知道的js坑
  • 关于肥胖和美国为什么那么多胖子
  • 机器视觉技术太阳能光伏硅片EL检测方案
  • BTA | 王涛:传统IT人如何用数据库思维来理解区块链?去中心化数据库也许是答案...
  • Vivint大规模IoT部署的指标收集
  • [NOSQL] Redis介绍
  • [nginx文档翻译系列] 控制nginx
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 2017前端实习生面试总结
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • CSS居中完全指南——构建CSS居中决策树
  • dva中组件的懒加载
  • gf框架之分页模块(五) - 自定义分页
  • IP路由与转发
  • Java 内存分配及垃圾回收机制初探
  • learning koa2.x
  • nfs客户端进程变D,延伸linux的lock
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 阿里云Kubernetes容器服务上体验Knative
  • 编写高质量JavaScript代码之并发
  • 翻译:Hystrix - How To Use
  • 猴子数据域名防封接口降低小说被封的风险
  • 基于组件的设计工作流与界面抽象
  • 数据可视化之 Sankey 桑基图的实现
  • 正则与JS中的正则
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • # .NET Framework中使用命名管道进行进程间通信
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (02)Hive SQL编译成MapReduce任务的过程
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)正点原子I.MX6ULL u-boot移植
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转) 深度模型优化性能 调参
  • ... 是什么 ?... 有什么用处?
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net 反编译_.net反编译的相关问题
  • .net网站发布-允许更新此预编译站点
  • .NET中使用Protobuffer 实现序列化和反序列化
  • [ Algorithm ] N次方算法 N Square 动态规划解决