您现在的位置是:群英 > 开发技术 > 编程语言
Go结构体类型主要用做什么,如何进行声明和定义
Admin发表于 2022-07-20 17:11:46735 次浏览
相信很多人对“Go结构体类型主要用做什么,如何进行声明和定义”都不太了解,下面群英小编为你详细解释一下这个问题,希望对你有一定的帮助

 



结构体类型可以用来保存不同类型的数据,也可以通过方法的形式来声明它的行为。本文将介绍go语言中的结构体和方法,以及“继承”的实现方法。

结构体类型

结构体类型(struct)在go语言中具有重要地位,它是实现go语言面向对象编程的重要工具。go语言中没有类的概念,可以使用结构体实现类似的功能,传统的OOP(Object-Oriented Programming)思想中的继承在go中可以通过嵌入字段的方式实现。

结构体的声明与定义:

// 使用关键字 type 和 struct 定义名字为Person结构体
type Robot struct {
	name string
	height int
}

初始化及赋值:

// 通过var声明
var r1 Robot
r1.name = "Optimus Prime"

// 字面量直接赋值
r2 := Robot{name: "Optimus Prime"}
r3 := Robot{"Optimus Prime", 100} //如果不加字段名,值必须按定义顺序给出

// new 函数
r4 := new(Robot)
r4.name = "Optimus Prime"
//或者
r5 := &Robot{}
r5.name = r1.name

方法

go语言中的函数和方法是有区别的,方法必须有名字,必须隶属于某一个类型,这个类型通过方法声明中的接收者(receiver)声明定义。

接收者声明位于关键字func和方法名称之间的圆括号中,必须包含确切的名称和类型字面量。

  • 类型就是当前方法所属的类型
  • 名称用于当前方法中引用它所属类型的值
package main

import "fmt"

type Robot struct {
	name string
	height int
}

func (r Robot) String() string{	
	return fmt.Sprintf("name: %s, height: %d",r.name, r.height)
}

func main() {
    r1 := Robot{name: "Optimus Prime", height: 100}
	fmt.Println(r1)  // 结果: name: Optimus Prime, height: 100
}

从String()方法的接收者声明可以看出它隶属于Robot类型,接收者名称为r。

结构体内嵌:“继承”与“重写”

Go 语言中没有继承的概念,具体原因和理念可参考官网:Why is there no type inheritance?

go语言可以通过嵌入字段来实现类似继承的效果,来看下面的代码:

package main

import "fmt"

type Skills struct {
	speak string 
}

func (s Skills) Speak()  {
	fmt.Println(s.speak)	
}

type Robot struct {
	name string // 姓名
	height int // 身高
	Skills
}

func main() {
	skill := Skills{speak: "hello !"}
	skill.Speak()
	
	robot := Robot{
		name: "Optimus Prime",
		Skills: skill,
	}
	robot.Speak()
}

嵌入字段的方法集合会被合并到被嵌入类型的方法集合中。上面代码中,robot.Speak() 会调用嵌入字段Skills的Speak()方法,类似于继承了Skills的Speak()方法。执行结果如下:

hello !
hello !

下面添加一个Robot类型的Speak()方法:

func (r Robot) Speak() {	
	fmt.Printf("My name is %s, ",r.name)
	r.Skills.Speak()
}

那么再次执行,会执行哪个Speak()方法呢?答案是Robot类型的Speak()方法,嵌入字段Skills的Speak()方法被“屏蔽”了,也就是说,被嵌入类型的方法覆盖了嵌入字段的同名方法,这与方法重写类似。

执行结果:

hello !
My name is Optimus Prime, hello !

可以通过链式的选择表达式,选择到嵌入字段的字段或方法,r.Skills.Speak() 就调用了嵌入字段Skills的Speak()方法。



现在大家对于Go结构体类型主要用做什么,如何进行声明和定义的内容应该都清楚了吧,希望大家阅读完这篇文章能有所收获。最后,想要了解更多Go结构体类型主要用做什么,如何进行声明和定义的知识,欢迎关注群英网络,群英网络将为大家推送更多相关知识点的文章。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: Go结构体类型
相关信息推荐
2022-01-15 17:51:18 
摘要:Java的容器是指什么? 容器可以管理对象的生命周期、对象与对象之间的依赖关系。 直白点说容器就是一段Java程序,能够帮助你管理对象间的关系。这篇我们来详细的了解一下Java容器,对大家认识和学习Java容器会有帮助,感兴趣的朋友就继续往下看吧。
2022-04-29 11:56:10 
摘要:给大家带来一篇关于python请求头如何自定义?的相关教程文章,内容涉及到Python、python教程等相关内容,更多关于python的内容希望能够帮助到大家。
2022-09-15 17:48:30 
摘要:本篇文章给大家带来了关于Java的相关知识,其中主要整理了Stream流的概念和使用的相关问题,包括了Stream流的概念、Stream流的获取、Stream流的常用方法等等内容,下面一起来看一下,希望对大家有帮助。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部