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
一天又平安的过去了,有任何问题欢迎留言与我告知 :)


<<:  Day 9 - 元件的资料传输(1)

>>:  [第九只羊] 迷雾森林舞会II 房间座位设定

Day 14 | 魔术方块AR游戏开发Part3 - 面的旋转(上)

在上一篇我们完成了魔术方块的侦测,今天我们要来制作面的旋转。 目录 选择的面 面的旋转 选择的面 建...

[iT铁人赛Day16]JAVA-switch范例

今天来示范一下switch的范例 范例程序码如下: import java.util.*; impo...

给别人前先包装:套件、汇入、存取修饰词 Packages, imports and Visibility modifiers

「如果有一天,我也写函式库,要怎麽分享呢?」诗忆好奇的问。 唯心笑了笑。「首先要先定义package...

Re: 新手让网页 act 起来: Day24 - React Hooks 之 useMemo

前言 昨天我们介绍过如何使用 React.memo 与 useCallback 来做效能优化,而 u...

Day9 Html常用标签_4

今天要介绍的东西是"标签属性"。 标签属性(Attributes)是让标签有更多...