前言大家好,我是星期五,上面说了介绍一些结构的知识。但是我们知道Go是通过结构体来模仿对象的,我们来看看。简介在Go中,我们没有类的概念,但是我们有结构体~Go中的结构体相当于其他语言中的类,基本可以实现和其他语言一样的操作。Constructor构造函数和其他语言一样,官方的理解是类实例化时执行的方法,通常用于赋值操作。但是在Go中,可能就不一样了,需要通过一个函数独立完成。StructuretypeStudentstruct{NamestringAgeintphonestring}ConstructorfuncNewStudent(namestring,ageint,phonestring)*Student{return&Student{Name:name,Age:age,phone:phone}}//函数尝试使用固定格式新建结构体名称赋值操作funcmain(){vars1=NewStudent("张三",18,"1111")fmt.Println(s1)}执行结果构造函数返回结构体指针通常有两种原因。第一个原因是传地址的性能比较高,第二个原因是因为规范,后面的函数绑定结构也比较规范。不必担心如何理解指针。对于结构体,不管是不是指针,其实用法都是一样的。函数绑定结构如果你有其他语言的基础,你可能对类和对象很熟悉。在传统方式中,方法被写入类中。但是在Go中,方法是通过绑定来添加的。语法func(一般用this绑定结构)函数名([参数1,参数2...])[(返回值1,返回值2,...)]{code}//一般用this,你也可以用others,这个好像是形参,随便改,用self,p,s,都是一样的例子:把方法绑定到Student结构上。func(thisStudent)say(){fmt.Printf("我是%v,我今年是%v,我的电话号码是%v\n",this.Name,this.Age,this.phone)}main代码funcmain(){//调用构造方法vars1=NewStudent("张三",18,"1111")//调用绑定Student的say方法s1.say()},执行结果是不是感觉有点像Java和Python我感觉上面的方法是通过结构体调用的,这里和C不一样。在Go中,面向对象基本上就是通过这些操作来模拟的。相比之下,我更习惯Go的方式,更加灵活。函数绑定结构(指针方法)的区别只是在要修改的结构前面加一个*。代码func(this*Student)say(){fmt.Printf("我是%v,我今年%v岁,我的电话号码是%v\n",this.Name,this.Age,this.phone)}执行结果和上面完全一样。函数绑定结构(指针方法与普通方法的区别)一般来说,使用指针的方法居多。嗯……不是大部分,但基本上都是。差码一func(thisStudent)say1(){fmt.Printf("我是%v,我今年是%v,我的手机号码是%v\n",this.Name,this.Age,this.phone)this.Name="666"//这里修改name为其他值}第3行修改Namefuncmain(){//调用构造函数vars1=NewStudent("张三",18,"1111")//调用Student绑定的say方法s1.say1()//prints1.Namefmt.Println(s1.Name)}第7行打印s1.Name的执行结果???结果没有修改,什么。代码2func(this*Student)say1(){fmt.Printf("我是%v,我今年是%v,我的电话号码是%v\n",this.Name,this.Age,this.phone)this.Name="666"//这里改名字为其他值}第一行改成*funcmain(){//调用构造方法vars1=NewStudent("张三",18,"1111")//调用Student绑定的say方法s1.say1()//Prints1.Namefmt.Println(s1.Name)}这次可以看到执行结果,结果变了,Name变了在其他函数中被修改,影响整个s1的名字。结论当使用函数绑定结构时,也可以将结构参数集成到*类型中。一是因为规范,二是因为面向对象就应该这样。修改一个对象的属性,理论上应该会影响整个对象的值。综上所述,我们已经描述了Go语言中一些面向对象的知识。包括构造函数,函数绑定结构,函数绑定结构参数是有指针和没有指针的区别。本文转载自微信公众号《Go语言进阶学习》,可通过以下二维码关注。转载本文请联系Go语言进阶学习公众号。
