在go中,如何生成全局变量

在go中,如何生成全局变量,go,Go,每当我运行这个程序时,它都会说,inputX和inputY是不可识别的。如何使该程序使用所有函数都可以访问的变量?我所要做的就是按inputX设置输入,然后打印出结果我只是把我的评论作为答案。。。我建议您不要这样做,但是您可以在包范围内声明变量。它看起来像这样 package main import ( "fmt" "bufio" "os" ) func main() { fmt.Print("LOADED!\n") fmt.Print("inser

每当我运行这个程序时,它都会说,inputX和inputY是不可识别的。如何使该程序使用所有函数都可以访问的变量?我所要做的就是按inputX设置输入,然后打印出结果

我只是把我的评论作为答案。。。我建议您不要这样做,但是您可以在包范围内声明变量。它看起来像这样

package main 

import (
    "fmt"
    "bufio"
    "os"
)

func main() {
    fmt.Print("LOADED!\n")
    fmt.Print("insert y value here: ")
    inputY := bufio.NewScanner(os.Stdin)
    inputY.Scan()
    inputXfunc()
}

func inputXfunc() {
    fmt.Print("insert x value here: ")
    inputX := bufio.NewScanner(os.Stdin)
    inputX.Scan()
    slope()
}

func slope() {
    fmt.Println(inputX.Text())
}
但是,更好的选择是更改方法定义以接受参数,并根据需要将值传递给它们。我希望如此

package main 

import (
    "fmt"
    "bufio"
    "os"
)

var inputX io.Scanner

func main() {
    fmt.Print("LOADED!\n")
    fmt.Print("insert y value here: ")
    inputY := bufio.NewScanner(os.Stdin)
    inputY.Scan()
    inputXfunc()
}

func inputXfunc() {
    fmt.Print("insert x value here: ")
    inputX = bufio.NewScanner(os.Stdin) // get rid of assignment initilize short hand here
    inputX.Scan()
    slope()
}

func slope() {
    fmt.Println(inputX.Text())
}

您可以创建一个
init()
函数,并在
main.go
中使用它,方法是使用像
godotenv
这样的包来设置操作系统的环境变量:

global.go
文件

func slope(inputX bufio.Scanner) {
        fmt.Println(inputX.Text())
    }

 slope(myInputWhichIsOfTypeIOScanner)
main.go
文件

package global

import (
    "log"
    "os"
    "strconv"

    "github.com/joho/godotenv"
)

var (
    SERVER_HOST        string
    SERVER_PORT        int
)

func InitConfig() {

    err := godotenv.Load()
    if err != nil {
        log.Fatal("Error loading .env file")
    }

    SERVER_HOST = os.Getenv("SERVER_HOST")
    SERVER_PORT, _ = strconv.Atoi(os.Getenv("SERVER_PORT"))
}

您仍然需要在其他包中导入“G”包才能使用变量,但我认为在Go(或任何其他语言)中处理全局变量的最佳方法是使用环境变量。

真正的全局变量在Go中不存在,您不应该在这里使用它们。您需要的是
func slope(inputX io.Scanner)
然后在
inputXfunc()中调用它
您应该将
inputX
传递给它。如果您想要一个可以被上面程序中的所有方法访问的变量,而不必将其传递给任何方法,那么只需在任何方法之外的main上面声明它,它将是“包作用域”,在这种情况下是全局的,因为您在package
main
上有io.Scanner在我的代码中不工作。它在“io”上给出了一个未定义的错误。您必须添加导入“io”才能使用io。Scanneralready尝试导入“io”无效。此代码对我根本不起作用。我正在寻找一种将输入从一段代码传递到另一个函数的方法。当然,在go中有一种方法可以做到这一点。@liam是的,它在第二个示例中概述了,如果您理解它并将其应用到您的程序中,它会很好地工作。有一个错误,我用了
io.Scanner
而不是
bufio.Scanner
,但这只是一个例子。在将其应用于您的程序时,应该清楚的是,您没有导入
io
包,
bufio
是您称之为
NewScanner
的东西。
package main

import(
    G "path/to/config"
)

func init() {
    G.InitConfig()
}

func main() {
    G.Init()
}