新聞中心
前言

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設,武邑企業(yè)網(wǎng)站建設,武邑品牌網(wǎng)站建設,網(wǎng)站定制,武邑網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,武邑網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
Hey,大家好呀,我是星期八,上文講述了引入了一些結(jié)構體的知識。
但是我們知道Go是通過結(jié)構體模仿對象的,一起來看看吧。
引言
在Go中,我們是沒有類這個概念的,但是我們有結(jié)構體呀~
Go中的結(jié)構體,就相當于其他語言的類,基本能實現(xiàn)和其他語言一摸一樣的操作。
構造函數(shù)
構造函數(shù),跟其他語言一樣了,官方理解就是在類實例化時執(zhí)行的方法,通常用于賦值操作。
但是在Go中,可能不是太一樣,需要獨立用到一個函數(shù)完成。
結(jié)構體
- type Student struct {
- Name string
- Age int
- phone string
- }
構造函數(shù)
- func NewStudent(name string, age int, phone string) *Student {
- return &Student{Name: name, Age: age, phone: phone}
- }
- //函數(shù)盡量采用固定格式 New結(jié)構體名
賦值操作
- func main() {
- var s1 = NewStudent("張三", 18, "1111")
- fmt.Println(s1)
- }
執(zhí)行結(jié)果
為什么構造函數(shù)返回的時結(jié)構體指針
通常來說兩個原因,第一個原因時傳地址性能更高,第二個原因是因為規(guī)范,后面的函數(shù)綁定結(jié)構體也是,更多的是一個規(guī)范。
不太用糾結(jié)說指針怎么怎么看不懂,對于結(jié)構體來說,是不是指針,其實用法都一樣。
函數(shù)綁定結(jié)構體
如果你有其他語言的基礎,你可能對于類和對象比較熟悉,傳統(tǒng)做法中,是將方法寫入類中的。
但是在Go中,采用綁定的方式添加方法。
語法
- func (一般用this 要綁定的結(jié)構體) 函數(shù)名([參數(shù)1,參數(shù)2...]) [(返回值1,返回值2,...)]{
- 代碼
- }
- //一般用this,也可以用其他的,this就像形參一樣,隨便換,用self,用p,用s,都一樣的
示例:給Student結(jié)構體綁定方法。
- func (this Student) say() {
- fmt.Printf("我是%v,我今年%v歲了,我的手機號是%v\n", this.Name, this.Age, this.phone)
- }
main代碼
- func main() {
- //調(diào)用構造方法
- var s1 = NewStudent("張三", 18, "1111")
- //調(diào)用Student綁定的say方法
- s1.say()
- }
執(zhí)行結(jié)果
有沒有感覺有點Java和Python的感覺了,上述可是通過結(jié)構體的方式調(diào)用方法的,這里就和C區(qū)分開了。
在Go中,基本就是通過這些操作,模擬出來面向?qū)ο蟮?,相比之下,我更習慣Go的方式,更加靈活。
函數(shù)綁定結(jié)構體(指針方式)
如果說區(qū)別,只是將要修改的 要綁定的結(jié)構體 前面加一個*。
代碼
- func (this *Student) say() {
- fmt.Printf("我是%v,我今年%v歲了,我的手機號是%v\n", this.Name, this.Age, this.phone)
- }
執(zhí)行結(jié)果和上述一摸一樣。
函數(shù)綁定結(jié)構體(指針方式和普通方式區(qū)別)
通常來說,一般使用指針的方式居多。
嗯...不是居多,是基本都是。
區(qū)別
代碼一
- func (this Student) say1() {
- fmt.Printf("我是%v,我今年%v歲了,我的手機號是%v\n", this.Name, this.Age, this.phone)
- this.Name = "666"http://這里修改了Name為其他值
- }
第3行修改了Name
- func main() {
- //調(diào)用構造方法
- var s1 = NewStudent("張三", 18, "1111")
- //調(diào)用Student綁定的say方法
- s1.say1()
- //打印s1.Name
- fmt.Println(s1.Name)
- }
第7行又打印了s1.Name
執(zhí)行結(jié)果
???結(jié)果沒修改,what。
代碼二
- func (this *Student) say1() {
- fmt.Printf("我是%v,我今年%v歲了,我的手機號是%v\n", this.Name, this.Age, this.phone)
- this.Name = "666"http://這里修改了Name為其他值
- }
第一行修改為*了
- func main() {
- //調(diào)用構造方法
- var s1 = NewStudent("張三", 18, "1111")
- //調(diào)用Student綁定的say方法
- s1.say1()
- //打印s1.Name
- fmt.Println(s1.Name)
- }
執(zhí)行結(jié)果
這次可以看到,結(jié)果變了,在其他函數(shù)修改了Name,影響了整個s1的Name。
結(jié)論
- 在使用函數(shù)綁定結(jié)構體時,也盡可能的將結(jié)構體參數(shù)整成*類型的。
- 一是因為規(guī)范,二是因為面向?qū)ο蟊驹撊绱?,修改對象的屬性,理論來說就應該影響整個對象值。
總結(jié)
上述我們講述了一些Go語言中面向?qū)ο蟮囊恍┲R。包括有構造函數(shù),函數(shù)綁定結(jié)構體,函數(shù)綁定結(jié)構體參數(shù)是指針和無指針區(qū)別。
本文轉(zhuǎn)載自微信公眾號「Go語言進階學習」,可以通過以下二維碼關注。轉(zhuǎn)載本文請聯(lián)系Go語言進階學習公眾號。
分享標題:Go語言基礎之結(jié)構體(夏日篇)
網(wǎng)頁網(wǎng)址:http://www.5511xx.com/article/djecsic.html


咨詢
建站咨詢
