Go语言学习笔记 - PART7 - 结构体

本文是Go语言结构体的入门教程,介绍了结构体的定义方式,其字段可以是多种类型。还阐述了初始化方式,如用new函数分配内存;点号选择器可赋值和取值;说明了内存布局、工厂函数、标签等内容,以及匿名字段、内嵌结构体和跨包调用的相关知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义方式

type identifier struct {
    field1 type1
    field2 type2
    ...
}
复制代码

结构体得字段可以是任何类型,甚至是结构体本身,也可以是函数或者接口

初始化方式

type Point struct { x, y int }
复制代码
  • 使用new函数给结构体变量分配内存

new函数获取到得是结构体类型得指针

  • 获取结构体类型指针

使用new函数跟使用&T{}是等价的,都是产生结构体类型指针

  • 获取结构体类型

  • 混合字面量语法

point1 := Point{0, 3}  (A)
point2 := Point{x:5, y:1}  (B)
point3 := Point{y:5}  (C)
复制代码

结构体的类型定义在它的包中必须是唯一的,结构体的完全类型名是:packagename.structname

点号选择器

  • 点号选择器可以给结构体的字段赋值
    point.x = 5
复制代码
  • 点号选择器可以获取结构体字段的值
    x := point.x
复制代码
  • 无论是结构体类型还是结构体类型指针,都可以使用点号来引用结构体字段
    type myStruct struct { i int }
    var v myStruct    // v是结构体类型变量
    var p *myStruct   // p是指向一个结构体类型变量的指针
复制代码

内存布局

结构体和它所包含的数据在内存中是以连续块的形式存在的

结构体工厂函数

Go不支持面向对象编程语言中的构造方法,但是可以通过函数实现

type File struct {
    fd      int     // 文件描述符
    name    string  // 文件名
}

// 定义工厂方法,函数名大写字母开头才能被跨包调用
func NewFile(fd int, name string) *File {
    if fd < 0 {
        return nil
    }
    return &File{fd, name}
}

// 调用工厂方法
f := NewFile(10, "./test.txt")
复制代码

如果想要强制使用工厂函数,那么可以将结构体的类型改为首字母小写

结构体的标签

结构体中的字段,除了名字和类型,还有一个可选的标签,它是附属在字段的字符串(相当于字段的解释)

  • 标签的内容需要通过反射获取
type TagType struct { // tags
	field1 bool   "An important answer"
	field2 string "The name of the thing"
	field3 int    "How much there are"
}

func main() {
	tt := TagType{true, "Barak Obama", 1}
	for i := 0; i < 3; i++ {
		refTag(tt, i)
	}
}

func refTag(tt TagType, ix int) {
    // 使用reflect包
	ttType := reflect.TypeOf(tt)
	ixField := ttType.Field(ix)
	fmt.Printf("%v\n", ixField.Tag)
}
复制代码

匿名字段和内嵌结构体

  • 结构体可以包含一个或多个匿名字段,此时字段的类型就是字段的名称
// 字段名称分别是:bool, string, int
type TagType struct {
	bool
	string
	int
}
复制代码

在结构体中,对于每种数据类型,只能有一个匿名字段

  • 匿名字段本身也可以是一个结构体类型

Go语言的继承是通过内嵌或组合来实现的

结构体属性跨包调用

结构体的属性首字母大写

type TagType struct {
	Field1 bool
	Field2 string
	Field3 int
}
复制代码

入门教程推荐: github.com/Unknwon/the…

内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
内容概要:本文深入探讨了利用历史速度命令(HVC)增强仿射编队机动控制性能的方法。论文提出了HVC在仿射编队控制中的潜在价值,通过全面评估HVC对系统的影响,提出了易于测试的稳定性条件,并给出了延迟参数与跟踪误差关系的显式不等式。研究为两轮差动机器人(TWDRs)群提供了系统的协调编队机动控制方案,并通过9台TWDRs的仿真和实验验证了稳定性和综合性能改进。此外,文中还提供了详细的Python代码实现,涵盖仿射编队控制类、HVC增强、稳定性条件检查以及仿真实验。代码不仅实现了论文的核心思想,还扩展了邻居历史信息利用、动态拓扑优化和自适应控制等性能提升策略,更全面地反映了群体智能协作和性能优化思想。 适用人群:具备一定编程基础,对群体智能、机器人编队控制、时滞系统稳定性分析感兴趣的科研人员和工程师。 使用场景及目标:①理解HVC在仿射编队控制中的应用及其对系统性能的提升;②掌握仿射编队控制的具体实现方法,包括控制器设计、稳定性分析和仿真实验;③学习如何通过引入历史信息(如HVC)来优化群体智能系统的性能;④探索中性型时滞系统的稳定性条件及其在实际系统中的应用。 其他说明:此资源不仅提供了理论分析,还包括完整的Python代码实现,帮助读者从理论到实践全面掌握仿射编队控制技术。代码结构清晰,涵盖了从初始化配置、控制律设计到性能评估的各个环节,并提供了丰富的可视化工具,便于理解和分析系统性能。通过阅读和实践,读者可以深入了解HVC增强仿射编队控制的工作原理及其实际应用效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值