跟著貓哥學Golang 12 結構體的方法

2021-07-07 09:35:50 字數 1939 閱讀 1890



golang 沒有類,只有結構體。不過golang可以在結構體型別上定義方法,其實就是配合結構體的函式。方法和之前講過的函式是有些小區別的——對應的結構體資訊(也叫「方法接受者」),出現在方法定義中。

貓哥語:有golang特色的方法。 

1. 結構體方法的定義格式:

func (var *struct_name) funcname( var0, var1... ) return type

來看個最簡單的例子:

package main

import "fmt"

type rectangle struct

func (v *rectangle) area() float32

func (v *rectangle) circle() float32

func main()

fmt.println(v.area())

fmt.println(v.circle())

}# 輸出

15.75

16

2. 可以對任何type define的型別繫結方法

來看這個例子:

package main

import "fmt"

type myinteger int

func (i myinteger) abs() int

return int(i)

}func main()

# 輸出:

100

3. 方法可以與命名型別或命名型別的指標關聯。

剛剛看到的兩個例子中的方法。乙個是在*rectangle指標型別上,而另乙個在 myinteger 值型別上。

有兩個原因需要使用指標接收者:

首先,避免在每個方法呼叫中拷貝值(如果值型別是大的結構體的話會更有效率);

其次,方法可以修改接收者指向的值。

來看下面這個對比的例子,就明白了。

package main

import (

"fmt"

"math"

)type vertex struct

func (v *vertex) belarger(f float64)

func (v vertex) belarger1(f float64)

func (v *vertex) distance() float64

func main()

fmt.println("original: ", v, v.distance())

fmt.println("----------------------------")

v.belarger1(5.0)

fmt.println("after no pointer method: ",v, v.distance())

fmt.println("----------------------------")

v.belarger(5.0)

fmt.println("after pointer method: ", v, v.distance())

fmt.println("----------------------------")

}# 輸出:

original: & 5

----------------------------

after no pointer method: & 5

----------------------------

after pointer method: & 25

belarger用的指標的,所以結構體裡的值改變了;與之對比的belarger1用的型別的,沒用指標,結構體裡的值沒有跟著變。



跟著貓哥學Golang 7 Map

大多數現代化的程式語言都有個類似map的概念,大意就是對映,go語言也不能例外。1.golang裡,map對映鍵到值,以貓哥的粗淺認識,map的作用類似於雜湊表或者python裡的字典,只不過比後兩者用得更廣泛。map在golang裡是一種資料型別,與golang的結構體類似,map必須先宣告 鍵值...

跟著貓哥學Golang 16 Channel

goroutine和channel是golang之所以被稱之為 天生併發 的兩個核心原因。channel是goroutine之間進行通訊的一種方式。與unix中的管道功能非常類似。貓哥說 其實就是資料結構裡面的佇列嘛 先進先出 channel宣告 channeltype chan chan chan...

跟著貓哥學Golang 6 結構體

非常類似於c語言,golang中的乙個結構體 struct 就是乙個欄位的集合。1.golang定義結構體很簡單 type struct func main var jerry person jerry.name jerry jerry.age 21 jerry.gender male fmt.pr...