文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Go语言基础之结构体(夏日篇)

2024-12-03 17:09

关注

 前言

Hey,大家好呀,我是星期八,上文讲述了引入了一些结构体的知识。

但是我们知道Go是通过结构体模仿对象的,一起来看看吧。

引言

在Go中,我们是没有类这个概念的,但是我们有结构体呀~

Go中的结构体,就相当于其他语言的类,基本能实现和其他语言一摸一样的操作。

构造函数

构造函数,跟其他语言一样了,官方理解就是在类实例化时执行的方法,通常用于赋值操作。

但是在Go中,可能不是太一样,需要独立用到一个函数完成。

结构体

  1. type Student struct { 
  2.     Name  string 
  3.     Age   int 
  4.     phone string 

构造函数

  1. func NewStudent(name string, age int, phone string) *Student { 
  2.     return &Student{Namename, Age: age, phone: phone} 
  3. //函数尽量采用固定格式 New结构体名 

赋值操作

  1. func main() { 
  2.     var s1 = NewStudent("张三", 18, "1111"
  3.     fmt.Println(s1) 

执行结果

为什么构造函数返回的时结构体指针

通常来说两个原因,第一个原因时传地址性能更高,第二个原因是因为规范,后面的函数绑定结构体也是,更多的是一个规范。

不太用纠结说指针怎么怎么看不懂,对于结构体来说,是不是指针,其实用法都一样。

函数绑定结构体

如果你有其他语言的基础,你可能对于类和对象比较熟悉,传统做法中,是将方法写入类中的。

但是在Go中,采用绑定的方式添加方法。

语法

  1. func (一般用this 要绑定的结构体) 函数名([参数1,参数2...]) [(返回值1,返回值2,...)]{ 
  2.     代码 
  3. //一般用this,也可以用其他的,this就像形参一样,随便换,用self,用p,用s,都一样的 

示例:给Student结构体绑定方法。

  1. func (this Student) say() { 
  2.     fmt.Printf("我是%v,我今年%v岁了,我的手机号是%v\n", this.Name, this.Age, this.phone) 

main代码

  1. func main() { 
  2.     //调用构造方法 
  3.     var s1 = NewStudent("张三", 18, "1111"
  4.     //调用Student绑定的say方法 
  5.     s1.say() 

执行结果

有没有感觉有点Java和Python的感觉了,上述可是通过结构体的方式调用方法的,这里就和C区分开了。

在Go中,基本就是通过这些操作,模拟出来面向对象的,相比之下,我更习惯Go的方式,更加灵活。

函数绑定结构体(指针方式)

如果说区别,只是将要修改的 要绑定的结构体 前面加一个*。

代码

  1. func (this *Student) say() { 
  2.     fmt.Printf("我是%v,我今年%v岁了,我的手机号是%v\n", this.Name, this.Age, this.phone) 

执行结果和上述一摸一样。

函数绑定结构体(指针方式和普通方式区别)

通常来说,一般使用指针的方式居多。

嗯...不是居多,是基本都是。

区别

代码一

  1. func (this Student) say1() { 
  2.     fmt.Printf("我是%v,我今年%v岁了,我的手机号是%v\n", this.Name, this.Age, this.phone) 
  3.     this.Name = "666"//这里修改了Name为其他值 

第3行修改了Name

  1. func main() { 
  2.   //调用构造方法 
  3.   var s1 = NewStudent("张三", 18, "1111"
  4.   //调用Student绑定的say方法 
  5.   s1.say1() 
  6.   //打印s1.Name 
  7.   fmt.Println(s1.Name

第7行又打印了s1.Name

执行结果

???结果没修改,what。

代码二

  1. func (this *Student) say1() { 
  2.   fmt.Printf("我是%v,我今年%v岁了,我的手机号是%v\n", this.Name, this.Age, this.phone) 
  3.   this.Name = "666"//这里修改了Name为其他值 

第一行修改为*了

  1. func main() { 
  2.   //调用构造方法 
  3.   var s1 = NewStudent("张三", 18, "1111"
  4.   //调用Student绑定的say方法 
  5.   s1.say1() 
  6.   //打印s1.Name 
  7.   fmt.Println(s1.Name

执行结果

这次可以看到,结果变了,在其他函数修改了Name,影响了整个s1的Name。

结论

总结

上述我们讲述了一些Go语言中面向对象的一些知识。包括有构造函数,函数绑定结构体,函数绑定结构体参数是指针和无指针区别。

本文转载自微信公众号「Go语言进阶学习」,可以通过以下二维码关注。转载本文请联系Go语言进阶学习公众号。

 

来源:Go语言进阶学习内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯