我想从 Go 中的另一个文件调用函数。任何人都可以帮忙吗?
test1.go
package main
func main() {
demo()
}
test2.go
package main
import "fmt"
func main() {
}
func demo() {
fmt.Println("HI")
}
如何demo
拨入?test2
_test1
我想从 Go 中的另一个文件调用函数。任何人都可以帮忙吗?
test1.go
package main
func main() {
demo()
}
test2.go
package main
import "fmt"
func main() {
}
func demo() {
fmt.Println("HI")
}
如何demo
拨入?test2
_test1
您的包裹中不能有多个main
。
更一般地说,一个包中不能有多个具有给定名称的函数。
删除main
intest2.go
并编译应用程序。该demo
功能将从中可见test1.go
。
Go Lang 默认只构建/运行提到的文件。要链接所有文件,您需要在运行时指定所有文件的名称。
运行以下两个命令之一:
$go run test1.go test2.go. //order of file doesn't matter
$go run *.go
如果你想构建它们,你应该做类似的事情。
我一直在寻找同样的东西。要回答您的问题“如何从 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")
}
一个实用、客观、简单的快速示例:
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
}
文件夹结构 复制 | |--duplicate_main.go | |--countLines.go | |--abc.txt
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)
}
}
}
package main
import (
"bufio"
"os"
)
func countLines(f *os.File, counts map[string]int) {
input := bufio.NewScanner(f)
for input.Scan() {
counts[input.Text()]++
}
}
go run ch1_dup2.go countLines.go abc.txt
go run *.go abc.txt
go build ./
go build ch1_dup2.go countLines.go
go build *.go
如果您只是运行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
或者你的可执行文件名在创建时碰巧被调用。
您可以通过将另一个文件声明为模块来从另一个文件导入函数。将这两个文件保存在同一个项目文件夹中。第一个文件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 .
!演示功能将根据需要从第一个文件执行!
作为一个不知道 go 模块发生了什么的愚蠢的人应该说:
go mod init "你的模块名称"
导入“您的模块名称/新目录的名称”
"你的新目录的名字" + . + 你的函数()
去跑步 。
你可以改写go run main.go。有时您不想创建目录并想在同一目录中创建新的 .go 文件,在这种情况下您需要注意,是否以大写字母开头并不重要,您应该运行所有 .go 文件
去运行*.go
因为
去运行 main.go
不起作用。