Go 語言基礎之結構體(夏日篇)

前言

Hey,大家好呀,我是星期八,上文講述了引入了一些結構體的知識。

但是我們知道 Go 是通過結構體模仿對象的,一起來看看吧。

引言

在 Go 中,我們是沒有類這個概念的,但是我們有結構體呀~

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 語言中面向對象的一些知識。包括有構造函數函數綁定結構體函數綁定結構體參數是指針和無指針區別

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/aMN00QkPhB5Q1iPJLq3low