golang怎么像python一样把逻辑写在函数外面?

在python中可以这样写如文件内容:

fob = open('./file.txt', 'a')
def write(string):
    fob.write(string)
def main():
    for i in messages:
        write(i)
fob.close()

在golang中怎么把fob写到函数外面?下面只是举的一个普通例子,我知道可以把var logfile和write函数写到main函数中,但是,如果其它函数要调用write函数怎么办?

package main

import (
    "fmt"
    ...
)

//↓这样写不行,应该怎么做?让这个文件内的函数能使用logfile变量
var logfile, err = os.OpenFile("./test.txt", os.O_WRONLY | os.O_CREATE | os.O_APPEND, 0666)
if err != nil{
    fmt.Println("open file fail")
}

func main(){
    for _, v := range messages{
        write(v)
    }
    logfile.Close()
}

func write(msg string){
    logfile.WriteString(msg)
}
阅读 3.6k
4 个回答

原来要这样,声明全局变量及类型,类型用反射获取,然后把逻辑写在init函数中,init函数在main函数之前执行。

package main
import (
    "os"
    "log"
)

var FOB *os.File
func init(){
    var err error
    var filename = "./file.txt"
    FOB, err = os.OpenFile(filename, os.O_WRONLY | os.O_CREATE | os.O_APPEND, 0666)
    if err != nil{
        log.Fatalln("open file error", err.Error())
    }
}

func main(){
    FOB.WriteString("...string...")
    FOB.Close()
}

大概这样吧

package main

import (
    "fmt"
    ...
)

var logfile file

func init () {
    logfile, err = os.OpenFile("./test.txt", os.O_WRONLY | os.O_CREATE | os.O_APPEND, 0666)
    if err != nil{
        fmt.Println("open file fail")
    }
}

func main(){
    for _, v := range messages{
        write(v)
    }
    logfile.Close()
}

func write(msg string){
    logfile.WriteString(msg)
}

Python 是可以执行 .py 文件中的全局代码的。Golang 没有这个,

Golang 的执行入口是 init()main().

你的Python版本就写错了。write()main() 根本没得到执行。

简单!这种方式定义变量,不能放在入口文件中(因为是从main开始执行的),把write方法和变量抽到一个模块中,就能按照python一样的写法搞了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题