在go中,我如何制作全局变量

时间:2015-11-24 23:55:29

标签: go

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())
}

每当我运行这个程序时,它说,inputX和inputY都是未识别的。如何使此程序使用所有函数都可访问的变量?我想做的就是通过inputX分配inputY然后打印出结果

2 个答案:

答案 0 :(得分:7)

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

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())
}

然而,更好的选择是将方法定义更改为接受参数,并根据需要将值传递给它们。这就像是这样;

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

 slope(myInputWhichIsOfTypeIOScanner)

答案 1 :(得分:1)

您可以使用init()这样的包来创建main.go函数并在godotenv中使用它来设置os的环境变量:

global.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"))
}

main.go档案

package main

import(
    G "path/to/config"
)

func init() {
    G.InitConfig()
}

func main() {
    G.Init()
}

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