155

我想从 Go 中的另一个文件调用函数。任何人都可以帮忙吗?

test1.go

package main

func main() {
    demo()
}

test2.go

package main

import "fmt"

func main() {
}

func demo() {
    fmt.Println("HI")
}

如何demo拨入?test2_test1

4

8 回答 8

108

您的包裹中不能有多个main

更一般地说,一个包中不能有多个具有给定名称的函数。

删除mainintest2.go并编译应用程序。该demo功能将从中可见test1.go

于 2013-01-04T10:17:32.317 回答
91

Go Lang 默认只构建/运行提到的文件。要链接所有文件,您需要在运行时指定所有文件的名称。

运行以下两个命令之一:

$go run test1.go test2.go. //order of file doesn't matter
$go run *.go

如果你想构建它们,你应该做类似的事情。

于 2017-05-13T13:16:14.053 回答
53

我一直在寻找同样的东西。要回答您的问题“如何从 test1 调用 test2 中的演示? ”,这是我的做法。go run test1.go使用命令运行此代码。将current_folder更改为test1.go所在的文件夹。

test1.go

package main

import (
    L "./lib"
)

func main() {
    L.Demo()
}

lib\test2.go

将 test2.go 文件放在子文件夹中lib

package lib

import "fmt"

// This func must be Exported, Capitalized, and comment added.
func Demo() {
    fmt.Println("HI")
}
于 2017-11-16T15:20:08.467 回答
8

一个实用、客观、简单的快速示例:

main.go

package main

import "pathToProject/controllers"

func main() {
    controllers.Test()
}

控制.go

package controllers

func Test() {
// Do Something
}

永远不要忘记:可见的外部函数、变量和方法以大写字母开头。

IE:

func test() {
    // I am not Visible outside the file
}
 
func Test() {
    // I am VISIBLE OUTSIDE the FILE
}
于 2020-11-23T15:17:09.100 回答
5
文件夹结构

复制
  |
  |--duplicate_main.go
  |
  |--countLines.go
  |
  |--abc.txt

重复的_main.go

    package main

    import (
        "fmt"
        "os"
    )

    func main() {
        counts := make(map[string]int)
        files := os.Args[1:]
        if len(files) == 0 {
            countLines(os.Stdin, counts)
        } else {
            for _, arg := range files {
                f, err := os.Open(arg)
                if err != nil {
                    fmt.Fprintf(os.Stderr, "dup2: %v\n", err)
                    continue
                }
                countLines(f, counts)
                f.Close()
            }
        }

        for line, n := range counts {
            if n > 1 {
                fmt.Printf("%d\t%s\n", n, line)
            }
        }
    }

countLines.go

    package main

    import (
        "bufio"
        "os"
    )

    func countLines(f *os.File, counts map[string]int) {
        input := bufio.NewScanner(f)
        for input.Scan() {
            counts[input.Text()]++
        }
    }
  1. go run ch1_dup2.go countLines.go abc.txt
  2. go run *.go abc.txt
  3. go build ./
  4. go build ch1_dup2.go countLines.go
  5. go build *.go
于 2020-10-02T03:00:43.690 回答
5

如果您只是运行go run test1.go并且该文件引用了同一包中另一个文件中的函数,则会出错,因为您没有告诉 Go 运行整个包,而是告诉它只运行那个文件。

您可以通过在 run commaned 中以多种方式将文件分组为一个包来告诉 go 作为一个完整的包运行。以下是一些示例(如果您的终端位于包的目录中):

go run ./

或者

go run test1.go test2.go

或者

go run *.go

您可以使用 build 命令获得相同的行为,并且在运行创建的可执行文件后将作为分组包运行,其中文件知道彼此的功能等。示例:

go build ./

或者

go build test1.go test2.go

或者

go build *.go

然后,当您将所有文件作为一个完整的包一起运行时,只需从命令行调用可执行文件即可为您提供与使用 run 命令类似的输出。前任:

./test1

或者你的可执行文件名在创建时碰巧被调用。

于 2020-07-14T05:42:01.013 回答
4

您可以通过将另一个文件声明为模块来从另一个文件导入函数。将这两个文件保存在同一个项目文件夹中。第一个文件test1.go应如下所示:

package main

func main() {
    demo()
}

从第二个文件中删除 main 函数,因为一个包中只能存在一个 main 函数。第二个文件test2.go应如下所示:

package main

import "fmt"

func demo() {
    fmt.Println("HI")
}

现在从将项目目录设置为工作目录的任何终端运行命令: go mod init myproject. 这将创建一个go.mod在项目目录中调用的文件。该mod文件的内容可能如下所示:

module myproject

go 1.16

现在从终端只需运行命令go run .!演示功能将根据需要从第一个文件执行!

于 2021-08-06T23:58:33.233 回答
0

作为一个不知道 go 模块发生了什么的愚蠢的人应该说:

  1. 创建你的 main.go
  2. 在同一目录中将其写入您的终端

go mod init "你的模块名称"

  1. 创建一个新目录并进入其中
  2. 创建一个新的 .go 文件并将目录的名称写为包名称
  3. 编写任何你想要的函数;请注意您的函数必须以大写字母开头
  4. 回到 main.go 和

导入“您的模块名称/新目录的名称”

  1. 最后你需要的是在它后面写下包的名称和你的函数名

"你的新目录的名字" + . + 你的函数()

  1. 并在终端中写下

去跑步 。

你可以改写go run main.go。有时您不想创建目录并想在同一目录中创建新的 .go 文件,在这种情况下您需要注意,是否以大写字母开头并不重要,您应该运行所有 .go 文件

去运行*.go

因为

去运行 main.go

不起作用。

于 2021-12-08T19:18:37.250 回答