#建構函數,跟其他語言一樣了,官方理解就是 在類別實例化時執行的方法,通常用於#賦值操作。
但是在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) }
func (一般用this 要绑定的结构体) 函数名([参数1,参数2...]) [(返回值1,返回值2,...)]{ 代码 } //一般用this,也可以用其他的,this就像形参一样,随便换,用self,用p,用s,都一样的
執行結果
#為什麼建構子傳回的時結構體指標######## ###########通常來說兩個原因,第一個原因時傳送位址效能較高,第二個原因是因為規範,後面的函數綁定結構體也是,更多的是一個規範。 ######
不太用纠结说指针怎么怎么看不懂,对于结构体来说,是不是指针,其实用法都一样。
如果你有其他语言的基础,你可能对于类和对象比较熟悉,传统做法中,是将方法写入类中的。
但是在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語言基礎之結構體(夏日篇)的詳細內容。更多資訊請關注PHP中文網其他相關文章!