前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言基础之结构体(夏日篇)

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

作者头像
Go进阶者
发布2021-01-22 10:52:08
2620
发布2021-01-22 10:52:08
举报
文章被收录于专栏:Go语言进阶学习

前言

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

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

引言

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

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

构造函数

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

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

结构体

代码语言:javascript
复制
type Student struct {
    Name  string
    Age   int
    phone string
}

构造函数

代码语言:javascript
复制
func NewStudent(name string, age int, phone string) *Student {
    return &Student{Name: name, Age: age, phone: phone}
}
//函数尽量采用固定格式 New结构体名

赋值操作

代码语言:javascript
复制
func main() {
    var s1 = NewStudent("张三", 18, "1111")
    fmt.Println(s1)
}

执行结果

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

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

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

函数绑定结构体

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

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

语法

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

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

代码语言:javascript
复制
func (this Student) say() {
    fmt.Printf("我是%v,我今年%v岁了,我的手机号是%v\n", this.Name, this.Age, this.phone)
}

main代码

代码语言:javascript
复制
func main() {
    //调用构造方法
    var s1 = NewStudent("张三", 18, "1111")
    //调用Student绑定的say方法
    s1.say()
}

执行结果

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

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

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

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

代码

代码语言:javascript
复制
func (this *Student) say() {
    fmt.Printf("我是%v,我今年%v岁了,我的手机号是%v\n", this.Name, this.Age, this.phone)
}

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

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

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

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

区别

代码一

代码语言:javascript
复制
func (this Student) say1() {
    fmt.Printf("我是%v,我今年%v岁了,我的手机号是%v\n", this.Name, this.Age, this.phone)
    this.Name = "666"//这里修改了Name为其他值
}

第3行修改了Name

代码语言:javascript
复制
func main() {
  //调用构造方法
  var s1 = NewStudent("张三", 18, "1111")
  //调用Student绑定的say方法
  s1.say1()
  //打印s1.Name
  fmt.Println(s1.Name)
}

第7行又打印了s1.Name

执行结果

???结果没修改,what。

代码二

代码语言:javascript
复制
func (this *Student) say1() {
  fmt.Printf("我是%v,我今年%v岁了,我的手机号是%v\n", this.Name, this.Age, this.phone)
  this.Name = "666"//这里修改了Name为其他值
}

第一行修改为*

代码语言:javascript
复制
func main() {
  //调用构造方法
  var s1 = NewStudent("张三", 18, "1111")
  //调用Student绑定的say方法
  s1.say1()
  //打印s1.Name
  fmt.Println(s1.Name)
}

执行结果

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

结论

  • 在使用函数绑定结构体时,也尽可能的将结构体参数整成*类型的。
  • 一是因为规范,二是因为面向对象本该如此,修改对象的属性,理论来说就应该影响整个对象值。

总结

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

一定要自己敲一下,如果在操作过程中有任何问题,记得下面讨论区留言,我们看到会第一时间解决问题。

不积跬步无以至千里,不积小流无以成江海,给自己一个成长的时间。我是码农星期八,如果觉得还不错,记得动手点赞一下哈。感谢你的观看。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Go语言进阶学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 构造函数
  • 函数绑定结构体
  • 函数绑定结构体(指针方式)
  • 函数绑定结构体(指针方式和普通方式区别)
    • 区别
      • 结论
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档