您好,欢迎访问一九零五行业门户网

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

构造函数构造函数,跟其他语言一样了,官方理解就是在类实例化时执行的方法,通常用于赋值操作。
但是在go中,可能不是太一样,需要独立用到一个函数完成。
结构体
type student struct { name string age int phone string}
构造函数
func newstudent(name string, age int, phone string) *student { return &student{name: name, age: age, phone: phone}}//函数尽量采用固定格式 new结构体名
赋值操作
func main() { var s1 = newstudent("张三", 18, "1111") fmt.println(s1)}
执行结果
为什么构造函数返回的时结构体指针
通常来说两个原因,第一个原因时传地址性能更高,第二个原因是因为规范,后面的函数绑定结构体也是,更多的是一个规范。
不太用纠结说指针怎么怎么看不懂,对于结构体来说,是不是指针,其实用法都一样。
函数绑定结构体如果你有其他语言的基础,你可能对于类和对象比较熟悉,传统做法中,是将方法写入类中的。
但是在go中,采用绑定的方式添加方法。
语法
func (一般用this 要绑定的结构体) 函数名([参数1,参数2...]) [(返回值1,返回值2,...)]{ 代码}//一般用this,也可以用其他的,this就像形参一样,随便换,用self,用p,用s,都一样的
示例:给student结构体绑定方法。
func (this student) say() { fmt.printf("我是%v,我今年%v岁了,我的手机号是%v\n", this.name, this.age, this.phone)}
main代码
func main() { //调用构造方法 var s1 = 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 (this student) say1() { fmt.printf("我是%v,我今年%v岁了,我的手机号是%v\n", this.name, this.age, this.phone) this.name = "666"//这里修改了name为其他值}
第3行修改了name
func main() { //调用构造方法 var s1 = newstudent("张三", 18, "1111") //调用student绑定的say方法 s1.say1() //打印s1.name fmt.println(s1.name)}

第7行又打印了s1.name
执行结果
???结果没修改,what。
代码二
func (this *student) say1() { fmt.printf("我是%v,我今年%v岁了,我的手机号是%v\n", this.name, this.age, this.phone) this.name = "666"//这里修改了name为其他值}
第一行修改为*了
func main() { //调用构造方法 var s1 = newstudent("张三", 18, "1111") //调用student绑定的say方法 s1.say1() //打印s1.name fmt.println(s1.name)}

执行结果
这次可以看到,结果变了,在其他函数修改了name,影响了整个s1的name。
结论在使用函数绑定结构体时,也尽可能的将结构体参数整成*类型的。
一是因为规范,二是因为面向对象本该如此,修改对象的属性,理论来说就应该影响整个对象值。
以上就是go语言基础之结构体(夏日篇)的详细内容。
其它类似信息

推荐信息