全局变量和切片的作用域

huangapple go评论87阅读模式
英文:

Go Global Variables and Scopes of slices

问题

我正在使用GO语言入门,遇到了一个我无法解决的错误。我该如何创建一个全局切片,使模块内的所有函数都可以使用它?以下是我的代码:

package main

import (
    "fmt"
)

type Req struct {
    Req  int
    Name string
}

var Reqs []Req

func ReadReqs(fp string) {
    var CReq Req
    CReq.Req = 1
    CReq.Name = "first"
    Reqs := append(Reqs, CReq)
}

func main() {
    Reqs := make([]Req, 0)

    if len(Reqs) > 0 {
        fmt.Println(Reqs[0])
    }

    fmt.Println(Reqs)
}

这段代码无法编译,因为出现了以下错误:

./question.go:18: Reqs declared and not used

我原以为声明 var Reqs []Req 应该可以声明变量,但在 ReadReqs 函数内似乎没有意识到它。我知道全局变量是不好的,但我想在这个简单的程序中使用全局变量。

英文:

I am starting out with GO language, and getting an error I cannot figure out. How do I create a global slice that all functions within the module can use? Here is what I have:

package main

import (
    "fmt"
)

type Req struct {
    Req     int
    Name    string
}

var Reqs []Req

func ReadReqs(fp string) {
    var CReq Req;
    CReq.Req = 1
    CReq.Name = "first"
    Reqs := append(Reqs, CReq)
}

func main() {
    Reqs := make([]Req, 0)

    if len(Reqs) > 0 {
        fmt.Println(Reqs[0])
    }

    fmt.Println(Reqs)
}

This code will not compile because of the following error:

./question.go:18: Reqs declared and not used

I was thinking that declaring var Reqs []Req should declare the variable, but it does not seem to be aware of it inside the ReadReqs function. I do realize that globals are BAD but I would like to use global var for this simple program.

答案1

得分: 3

首先,我建议你在继续之前阅读《Effective Go》(http://golang.org/doc/effective_go.html)。

你使用以下方式声明全局变量:

var Reqs []Req

然后再使用相同的名称重新声明一个变量:

Reqs := ......

这样你就声明了两个不同的变量。


使用var Name type也会初始化变量:

var s string

等同于:

s := ""

所以以下这行代码是多余的:

Reqs = make([]Req, 0)

你可以在Golang Play上尝试你修复后的代码。

英文:

Okay first of all I'd recommend you to read Effective Go before continuing.

You are declaring your global variable using:

var Reqs []Req

Then re-declaring a variable with the same name using:

Reqs := ......

You are declaring two different variables.


var Name type also initializes the variable:

var s string

Is equivalent to:

s := ""

So this makes the following line useless:

Reqs = make([]Req, 0)

You can try your fixed code here (Golang Play).

答案2

得分: 2

使用:=,你声明了一个新的变量(而不是写入全局变量),这个新变量在函数作用域中未被使用(与全局变量无关)。

英文:

With := you are declaring a new variable (not writing to the global) and that new variable at function scope is unused. (Has nothing to do with globals.)

答案3

得分: 1

你正在使用:=运算符重新声明Reqs。去掉冒号。

你可能应该先从基础知识开始:

英文:

You're re-declaring Reqs with the := operator. Drop the colon.

You should probably start with the basics first:

huangapple
  • 本文由 发表于 2014年8月12日 22:01:52
  • 转载请务必保留本文链接:https://go.coder-hub.com/25266304.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定