从函数的名称判断,性能并不是那么关键,甚至不能仅仅为了节省将参数作为参数传递所需的时间/空间而考虑将参数移动到全局变量(像判断文件这样的IO操作比调用函数并将值传递给它们慢得多).

int

Go中的参数始终按值传递,并生成所传递值的副本.如果传递指针,指针值将被复制并传递.当一个切片被传递时,切片值(一个小的描述符)将被复制并传递——它将指向同一个备份数组(不会被复制).

另外,如果您需要在函数中多次访问片,参数通常是额外的收获,因为编译器可以进一步优化/缓存,而如果它是全局变量,则必须更加小心.

更多关于切片及其内部 struct 的信息:Go Slices: usage and internals

如果你想要准确的性能数据,基准测试!

slices_test.gogo test -bench .
package main

import (
    "testing"
)

var gslice = make([]string, 1000)

func global(s string) {
    for i := 0; i < 100; i++ { // Cycle to access slice may times
        _ = s
        _ = gslice // Access global-slice
    }
}

func param(s string, ss []string) {
    for i := 0; i < 100; i++ { // Cycle to access slice may times
        _ = s
        _ = ss // Access parameter-slice
    }
}

func BenchmarkParameter(b *testing.B) {
    for i := 0; i < b.N; i++ {
        param("hi", gslice)
    }
}

func BenchmarkGlobal(b *testing.B) {
    for i := 0; i < b.N; i++ {
        global("hi")
    }
}

输出示例:

testing: warning: no tests to run
PASS
BenchmarkParameter-2    30000000                55.4 ns/op
BenchmarkGlobal-2       30000000                55.1 ns/op
ok      _/V_/workspace/IczaGo/src/play  3.569s