方法宣告
package geometry
import
("math"
)type point struct
type path [
]point
// 函式
func
distance
(p,q point)
float64
// 方法
// p 方法的接收器
func
(p point)
distance
(q point)
float64
// go語言能夠給任意型別定義方法,
// 我們可以給同乙個包內任意的命名型別定義方法,只要這個命名型別的底層型別不是指標或inte***ce
func
(p path)
distance()
float64
p := point
q := point
perim := path,,
} fmt.
println
(distance
(p,q)
)// 函式呼叫
fmt.
println
(p.distance
(q))
// 方法呼叫
// p.distance的表示式叫做選擇器,選擇器也會用來選擇乙個struct型別的字段,由於方法和字段都在同乙個命名空間,所以如果我們宣告乙個x的方法的話,編譯器會報錯。
fmt.
println
(perim.
distance()
)// 方法呼叫
// 編譯器會更具方法的名字以及接收器來決定具體呼叫哪個函式
基於指標物件的方法// 這個方法名字為(*point).scaleby
func
(p *point)
scaleby
(factor float64
)
type p *
int
fun (p)f(
)// error
p := point
pptr :=
&p pptr.
scaleby(2
)p := point
(&p)
.scaleby(2
) fmt.
println
(p)// ""
//編譯器會隱式地幫我們用&p去呼叫scaleby這個方
p.scaleby(2
)point
.scaleby(2
)// compile error
nil也是乙個合法的接收器型別
func
(list *intlist)
sum(
)int
return list.value + list.tail.
sum()}
//可以通過引用來操作內部值,但是在方法想要修改引用本身是不會影響原始值的,比如把他置為nil,或者讓這個引用指向其他的物件,呼叫方不會受到影響。
通過嵌入結構體來擴充套件型別type point struct
type coloredpoint struct
...// 呼叫
var cp coloredpoint
// 以下兩種方法一樣
cp.x =
1cp.point.x =
1
var p = coloredpoint
, red}
var q = coloredpoint
, blue}
fmt.
println
(p.distance
(q.point)
)// coloredpoint型別的接收器呼叫point的方法
p.scaleby(2
) q.
scaleby(2
)fmt.
println
(p.distance
(q.point)
)// "10"
// 內嵌欄位你會指導編譯器去生成額外的包裝方法來委託已經宣告好的方法
// 實現角度
//func (p coloredpoint) distance(q point) float64
//func (p *coloredpoint) scaleby(factor float64)
type coloredpoint struct
p := coloredpoint
, red}
q := coloredpoint
, blue}
fmt.
println
(p.distance
(*q.point)
)// "5"
var cache =
struct
func
lookup
(key string
)string
方法值和方法表示式
方法值
p := point
q := point
distancefromp := p.distance // method value
fmt.
println
(distancefromp
(q))
scalep := p.scaleby // method value
scalep(2
)
type rocket struct
func
(r *rocket)
launch()
// 傳入乙個方法
r :=
new(rocket) time.
afterfunc(10
* time.second,
func()
)// 直接用方法"值"傳入afterfunc的話可以更為簡短
time.
afterfunc(10
* time.second, r.launch)
方法表示式p := point
q := point
distance := point.distance // method expression
fmt.
println
(distance
(p, q)
)// "5"
fmt.
printf
("%t\n"
, distance)
// "func(point, point) float64"
scale :=
(*point)
.scaleby
scale
(&p,2)
fmt.
println
(p)// ""
fmt.
printf
("%t\n"
, scale)
// "func(*point, float64)"
type point struct
func
(p point)
add(q point) point
}func
(p point)
sub(q point) point
}type path [
]point
func
(path path)
translateby
(offset point, add bool
)else
for i :=
range path
}
package log
type logger struct
func
(l *logger)
flags()
int//getter
func
(l *logger)
setflags
(flag int
)func
(l *logger)
prefix()
string
//getter
func
(l *logger)
setprefix
(prefix string
)
go專家程式設計系列(7)方法
type a struct func a a name string func main fmt.println a.name fmt.println a.name a 變數a就是所謂的方法接收者,他會作為方法name的第乙個引數傳入 go中函式型別只和引數與返回值有關,方法本質上就是普通的函式 f...
Go學習 10 方法
go 語言中同時有函式和方法。乙個方法就是乙個包含了接受者的函式,接受者可以是命名型別或者結構體型別的乙個值或者是乙個指標。所有給定型別的方法屬於該型別的方法集 方法只是乙個函式,它帶有乙個特殊的接收器型別,它是在func關鍵字和方法名之間編寫的。接收器可以是struct型別或非struct型別。接...
Go學習 8 方法
接收者 接收者型別 func t type methodname parameter list 相當於給接受者t新增了函式methodname,類似於js中的物件導向,給類新增方法,只不過go沒有物件導向,所以這麼搞 這樣的話,呼叫methodname就需要t.methodname 來呼叫了pack...