热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang结构体struct学习笔记

结构体structGo中的struct与C中的struct非常相似,并且Go没有class使用type<Name>struct{}定义结构,名称遵循可见性规则

结构体struct

  1. Go中的struct与C中的struct非常相似,并且Go没有class
  2. 使用typestruct{}定义结构,名称遵循可见性规则
  3. 支持指向自身的指针类型成员
  4. 支持匿名结构,可用作成员或定义成员变量
  5. 匿名结构也可以用于map的值
  6. 可以使用字面值对结构进行初始化
  7. 允许直接通过指针来读写结构成员
  8. 相同类型的成员可进行直接拷贝赋值
  9. 支持 ==!=比较运算符,但不支持><
  10. 支持匿名字段,本质上是定义了以某个类型名为名称的字段
  11. 嵌入结构作为匿名字段看起来像继承,但不是继承
  12. 可以使用匿名字段指针
  13. 在函数,属于值拷贝,如果要改原值,需要修改指针。
    “`
    type person struct{
    name string
    age int
    }
    func A(per *person){
    per.age = 13
    }

如果需要改的次数过多,需要先取指针(推荐)

        a := &person{
name :"Joe",
age:19,
}
a.name = "xiaoming" //直接操作指针就可以

A(a)
B(a)

func A(per *person){
per.age = 13
}

func B(per *person){
per.age = 15
}
  1. 基本使用
   type person struct{
Name string
Age int
}

func main(){
a:= person{
Name:"Joe"
}
a.Age = 19
fmt.Println(a)
}
  1. 匿名结构
   func main(){
// a := struct{
a := &struct{
name string
age int
}{
name:"xiaoming",
age:19,
}

fmt.Println(a)
}
  1. 嵌套匿名结构体
   type person struct{
name string
age int
contact struct{
phone, city string
}
}

func main(){
a := person{name:"joe",age:19}
a.contact.phOne= "122332" // 只能这样赋值
a.contact.city = "beijing"
fmt.Println(a)
}
  1. 匿名字段
   type person struct{
string
int
}
func main(){
a := person{"joe",19} // 顺序不能出错
fmt.Println(a)
}
  1. 继承

    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:"han",age:12,human:human{sex:1}}
    b := student{name:"zhang",age:19,human:human{sex:0}}
    a.name = "joe"
    a.age = 13
    a.sex = 100
    fmt.Println(a)
    }
  2. 内外层有同名属性

    type person struct{
    name string
    age int
    }
    type student struct{
    person
    name string
    age int
    }

    func main(){
    a := student{name:"zhangsan",age:12,person:person{name:"lisi",age:20}}
    fmt.Println(a.name) // zhangsan
    fmt.Println(a.person.name) //lisi
    }

    // 嵌入级别大于1个的时候 ,不允许有同名属性,否则编译报错

Struct

type person struct{
name string
age int
}
  1. 使用:

    var P person || P := {"Tom",25} || P := {age:24,name:"Tom"}
    P.name = "xiaoming"
    P.age = 12
    fmt.Println(P)

    r1 := new(Rect)
    r2 := &Rect{}
    r3 := &Rect{0,0,100,200}
    r4 := &Rect{width:100,height:200}

还有其他几种声明使用方式
1. 按照顺序提供初始化值
P := person{“Tom”,25}
2. 通过 field:value 的方式初始化,这样可以任意顺序
P := person{age:24,name:”Tom”}
3. 当然也可以通过new函数分配一个指针,此处P的类型为 *person
P := new(person)

  1. 匿名字段

    type Human struct {
    name string
    age int
    weight int
    }

    type Student struct {
    Human // 匿名字段,那么默认Student就包含了Human的所有字段
    speciality string
    }
  2. 方法(method)
    func (r ReceiverType) funcName(parameters)(results)

    func (r Rectangle) area() float64{
    return r.width*r.height
    }

方法

  1. Go中虽然没有class,但依旧有method
  2. 通过显示说明receiver来实现与某个类型的组合
  3. 只能为同一个包中的类型定义方法
  4. Receiver可以是类型的值或指针
  5. 不存在方法重载
  6. 可以使用值或指针来调用方法,编译器会自动完成转换
  7. 从某种意义上来说,方法是函数的语法糖,因为receiver其实就是方法所接收的第1个参数
  8. 如果外部结构和嵌入结构存在同名方法,则优先调用外部结构的方法
  9. 类型别名不会拥有底层类型所附带的方法
  10. 方法可以调用结构中的非公开字段
  1. 使用
   type person struct {
name string
sex int
}
func (p person)sayHello(){ //(p是参数,person是接收者的类型)
fmt.Println("我是person")
}

func main() {
a := person{}
a.sayHello()
}
  1. 方法里面改变结构体的属性 -> 传递指针
   type A struct{
name string
}
func main(){
a := A{}
a.Print()
fmt.Println(a.name)
}

func(a *A)Print(){
a.name = "aa"
fmt.Println("A")
}
  1. 底层类型的结构定制(只有当前包中有效)
   type TZ int
func main(){
var a TZ
a.Print()
}

func (a *TZ)Print(){
fmt.Println("TZ")
}
  1. method expression -> 直接通过类型调用,而不用通过变量来调用
   type TZ int
func main(){
var a TZ
a.Print() // method value 通过变量来调用方法
(*TZ).Print(&a) // (*TZ)是receiver,&a是变量
}

func (a *TZ)Print(){
fmt.Println("TZ")
}
  1. method冲突,和struct一样
  2. 通过method修改变量的值
   type TZ int
func main(){
var a TZ
fmt.Println(a)
a.AutoAdd()
fmt.Println(a)
}
func (tz *TZ)AutoAdd(){
*tz += 100
}

推荐阅读
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 加密世界下一个主流叙事领域:L2、跨链桥、GameFi等
    本文介绍了加密世界下一个主流叙事的七个潜力领域,包括L2、跨链桥、GameFi等。L2作为以太坊的二层解决方案,在过去一年取得了巨大成功,跨链桥和互操作性是多链Web3中最重要的因素。去中心化的数据存储领域也具有巨大潜力,未来云存储市场有望达到1500亿美元。DAO和社交代币将成为购买和控制现实世界资产的重要方式,而GameFi作为数字资产在高收入游戏中的应用有望推动数字资产走向主流。衍生品市场也在不断发展壮大。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
author-avatar
情人有意_119
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有