iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
自我挑戰組

30 天學 Golang?Go 啦哪次不 Go系列 第 9

Day9# Function 及 Function Receiver

終於來到了第九天,今天要再更深入介紹函式(Function)以及 Function Receiver(Methods)在做什麼,那麼話不多說,我們就開始吧 ─=≡Σ(((っ゚∀゚)っ

Function

可以把 Function 想像成一台機器,當我們把丟給他一個輸入值,他就會回給我們一個輸出值,而要怎麼處裡這個輸出值,就會在函式內進行處理。

在 Go 使用 func 來定義函式:

1. 一般宣告: func 函式名稱(參數) return T { to do...}

package main

import "fmt"

func main() {
	fmt.Println(add(1, 2))
}

func add(x int, y int) int {
	return x + y
}

2. Expression
使用 := 定義函式

package main

import "fmt"

func main() {
	add := func(x, y int) int {
		return x + y
	}
	fmt.Println(add(1, 2))
}

其實函式的使用方法跟多數程式語言的用法相比大同小異,倒是方法讓我搞混了相當久,你跟函式不是長得一樣嗎!

但其實他們在定義上有點不一樣,方法(Methods)指的是作用在某個「物件」上的函式,可以先來看看方法在使用時的情境:

package main

import "fmt"

type Cat struct {
	name string
	age  int
}

func (c Cat) getName() string {
	return c.name
}

func main() {
	cat := Cat{name: "BuiBui", age: 5}
	fmt.Println(cat.getName())
}

首先先定義了一個 struct Cat,並且在 main 函式內宣告一個 Cat 屬性的變數,而這個 cat 變數可以呼叫 getName 這個方法。

咦,那麼為什麼 cat 會有 getName 這個方法可以用呢?
注意看的話會發現 getNamefunc 中間有多了一欄的參數,而這就是 receiver 以及他做的一些手腳。(c Cat) 後面的 Cat 會綁定在 Cat 這個屬性上,而前方的 c 則是呼叫這個方法的變數。

雖然在 Go 裡面並沒有物件導向,但能藉由 receiver 來實作出「實體方法」。如果知道物件導向的話,應該對這件行為就不會太陌生。

以 Ruby 作為物件導向的例子,當我有個 Cat 類別,而 say_hello 則是 Cat 的實體方法,該如何使用呢?

class Cat
  def initialize(name)
    @name = name
  end

  def say_hello
    puts "Hello, my name is #{@name}"
  end
end

想要建立一個 Cat 實體,會使用 cat = Cat.new(name: 'Kitty'),而建立的實體就能透過 . 的方法使用 say_hello 這個方法:

p cat.say_hello
# => Hello, my name is Kitty.

有在寫 Ruby 的話,應該都知道 Ruby 沒有函式,因為 Ruby 所以東西都是物件。

一開始雖然不太懂 recevier 的運作,方法其實也只是多了 recevier 參數的函式,最後能以物件導向的方式思考好像就更能理解了。

結尾

在辦公室寫文章,有很多朋友邊對我比讚邊回家,感到無比溫馨又淒涼 Q_Q
一天又平安的過去了,有任何問題歡迎留言與我告知 :)


上一篇
Day8# Array & Slice(下)
下一篇
Day#10 Struct
系列文
30 天學 Golang?Go 啦哪次不 Go20

尚未有邦友留言

立即登入留言