Go:调用将指针传递到数组的函数

Go:调用将指针传递到数组的函数,go,Go,我花了一点时间尝试这样做,我想我需要一个全局数组(不是切片),我想把它作为指针传递,而不是按值传递。接收指针的函数需要测试nil,如果为nil,则使用例如:“baForm,oOserr=ioutil.ReadFile(sFormName)”从磁盘读取数组。调用函数可以将全局数组或本地数组传递给调用函数,我认为调用函数将被垃圾收集 这样做的原因是我需要一个标准函数来从磁盘读取表单,并且常用的表单是全局存储的。不管是否有人认为有更好的方法,我仍然想知道如何实现这一点,即:a)使用全局数组或本地数组,

我花了一点时间尝试这样做,我想我需要一个全局数组(不是切片),我想把它作为指针传递,而不是按值传递。接收指针的函数需要测试nil,如果为nil,则使用例如:“baForm,oOserr=ioutil.ReadFile(sFormName)”从磁盘读取数组。调用函数可以将全局数组或本地数组传递给调用函数,我认为调用函数将被垃圾收集


这样做的原因是我需要一个标准函数来从磁盘读取表单,并且常用的表单是全局存储的。不管是否有人认为有更好的方法,我仍然想知道如何实现这一点,即:a)使用全局数组或本地数组,b)不通过值传递,c)全局数组只从磁盘读取一次,而本地数组将在每次调用函数时读取。TIA。

阅读您的描述,我不明白为什么将指针传递给数组比传递切片更好,但这取决于您

您可以像在C中一样传递指针--在声明中附加一个星号(
*
),并在调用函数时在值上附加一个符号(
&


请记住,在Go中,数组大小是其类型的一部分。这意味着函数声明将嵌入数组大小,因此不能使用任何不同大小的数组调用函数。仅此原因就足以保证使用切片而不是数组。

下面是一个示例程序,它根据使用计数维护动态表单缓冲区。如果ReadForm函数找到一个表单,它将返回该表单的地址和一个nil错误

package main

import (
    "fmt"
    "io/ioutil"
    "math"
    "os"
    "sync"
)

type Form struct {
    Name     string
    useCount int64
    Data     []byte
}

// The capacity of the forms buffer.
const formsCap = 2

// The forms buffer.
var (
    forms     = make(map[string]*Form, formsCap)
    formsLock sync.RWMutex
)

func ReadForm(name string) (form *Form, err os.Error) {
    formsLock.RLock()
    form, ok := forms[name]
    formsLock.RUnlock()
    if !ok {
            form = &Form{name, 0, nil}
    }
    if form.Data == nil {
        data, err := ioutil.ReadFile(name + ".form")
        if err != nil {
            return nil, err
        }
        form = &Form{name, 0, data}
        formsLock.Lock()
        if len(forms) >= formsCap {
            minForm := &Form{useCount: math.MaxInt64}
            for i, f := range forms {
                if f.useCount < minForm.useCount {
                    minForm = f
                }
            }
            minform.Data = nil
        }
        forms[name] = form
        formsLock.Unlock()
    }
    form.useCount++
    return form, nil
}

func main() {
    // form files are named name.form e.g. form1.form
    for _, name := range []string{"form1", "form2", "form3"} {
        f, err := ReadForm(name)
        if err != nil {
            fmt.Println(err)
        } else {
            fmt.Println(string(f.Data))
        }
    }
    fmt.Println(len(forms), forms)
}
主程序包
进口(
“fmt”
“io/ioutil”
“数学”
“操作系统”
“同步”
)
类型表单结构{
名称字符串
useCount int64
数据[]字节
}
//窗体缓冲区的容量。
常数formsCap=2
//表单缓冲区。
变量(
forms=make(映射[字符串]*表单,formsCap)
formsLock sync.RWMutex
)
func ReadForm(名称字符串)(form*form,err os.Error){
formsLock.RLock()
表单,确定:=表单[名称]
formsLock.RUnlock()
如果!好的{
form=&form{name,0,nil}
}
如果form.Data==nil{
数据,err:=ioutil.ReadFile(名称+“.form”)
如果错误!=零{
返回零,错误
}
表单=&表单{name,0,data}
formsLock.Lock()
如果len(forms)>=formsCap{
minForm:=&Form{useCount:math.MaxInt64}
对于i,f:=范围形式{
如果f.useCount
编辑:修改示例程序以使用互斥锁同时访问
表单
映射