不定长度参数 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
时间飞逝,已到第14天了 明天就一半ㄌ,好感动眼睛流汗 今天我们要干大事!!! 要来解 REVERS...
题号:59 标题:Spiral Matrix II 难度:Medium Given a positi...
IntelliMindz offers Power BI Course in Bangalore. ...
前言 使用python原生之pickle函式库进行序列化。 程序实作 提供一个年龄资料集,来实作序列...
Day28已建立好环境了,接下来开始制作CURD功能罗~ Controller php artisa...