[13th][Day7] func -1

不定长度参数 Variadic Functions
Golang 中,有些函式的参数长度是不固定的,像是 fmt 套件的 Printf 及 Sprintf 函式,这两个函式,第一个参数是做为模板的字串,第二个以後的参数就是我们要填入的值,而值的数量是不固定的
这是由於 Go 支援 不定长度参数这个强大的东东

package main
 
import (
    "log"
)
 
func sum(args ...int) int {
    sum := 0.0
 
    for _, e := range args {
        sum += e
    }
 
    return sum
}
 
func main() {
    s := sum(1, 2, 3, 4, 5)
 
    fmt.Println(s)
}

输出为 15


    s1 := sum(1, 2)
    s2 := sum(1, 2, 5)
    s3 := sum(9, 4, 8, 7)
    s4 := sum(1, 0, 4, 8, 5, 7, 6)
    

不定参数传入函式後,对参数本身来说是一个 slice[],在函式中透过此 slice[] 即可取得个别的参数值。
至於 slice[] 是什麽呢??
简单来说就是 array ,之後再来详谈

传值呼叫 vs. 传址呼叫
如同 C 语言,所有 Go 的函式都是传值呼叫 (call by value),而这个值有可能是基本型别或指标或其他型别。当我们传递指标时,我们会拷贝指标的位址,但不会拷贝指标所指向的值;当值很大时,传递指标比传整个值有效率。

而在实际应用的过程当中
有些变数、方法的操作必须经由 address 才有办法更改
如 database 的 scan , 或是 json.UnMarshal 的写入
会看到很多 * & 符号

init
init() 是一个特殊的函式,若程序码内有 init 会在程序一开始执行的时候呼叫该函式,顺序在 main 函式之前。

init()
autoload()
start()
...etc

go 的 func 宣告中常常会看到一堆括号,一堆奇奇怪怪的括号
让我们来稍微检视一下

不带 return

func functionName(name string) {}
func functionName(name1 string, name2 string) {}

匿名函式

func(){
    //do something
}

匿名函式 + 执行

func(){
    //do something
}()

一个 return 值

func functionName(name string) string {}
func functionName(name string) (str string) {}

两个 return 值

func functionName(x, y int) (int, int) {}

两个 return 值 + 预先宣告

func functionName(x, y int) (return1 int , return2 int) {}

带 receiver 的函式

func (v Revicers) receiverFunc() float64 {}
func (v *Revicers) receiverFunc(f float64) {}

一开始看到这些 func 时总是令我觉得非常困惑,但多看几次会有一点点方向,实际用过後才会了解到底功能在哪

指标接受器 Pointer Receivers
『宣告』的动作定义了程序的各种实体物件以及部分或全部的属性 Go 主要有四种类型的宣告语句:

var   变数
const 常数
type  型别
func  函式实体

带 recevier 的 func 宣告方式如下
recevier 写在 func 和 method name 之间


type Revicers struct {
	X, Y float64
}

func (v Revicers) SubFunc() float64 {
	return math.Max(v.X, v.Y)
}

func main() {
    a1 := Revicers{28, 25}
	fmt.Println(a1.SubFunc())
}

输出为 28

(v Revicers) 就是 recevier
这个命名 func (v Revicers) SubFunc() float64 {} 可以解读为
SubFunc() method 拥有一个「类别为 Revicers 宣告为 v 」的 receiver


<<:  day 9 - 小范围开发 & go test

>>:  Flutter体验 Day 9-Button组件

[Day 14] Reverse 小入门

时间飞逝,已到第14天了 明天就一半ㄌ,好感动眼睛流汗 今天我们要干大事!!! 要来解 REVERS...

找LeetCode上简单的题目来撑过30天啦(DAY29)

题号:59 标题:Spiral Matrix II 难度:Medium Given a positi...

Power BI Course in Bangalore

IntelliMindz offers Power BI Course in Bangalore. ...

[第27天]30天搞懂Python-序列化

前言 使用python原生之pickle函式库进行序列化。 程序实作 提供一个年龄资料集,来实作序列...

[Day 29] Laravel+MongoDB+Vue CRUD - part 2

Day28已建立好环境了,接下来开始制作CURD功能罗~ Controller php artisa...