Go系列(二) 方法

2021-10-23 07:16:41 字數 4408 閱讀 8267

方法宣告

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