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...