Я хочу вызвать функцию из другого файла на go lang, может ли кто-нибудь помочь?
test1.go
package main
func main() {
demo()
}
test2.go
package main
import "fmt"
func main() {
}
func demo() {
fmt.Println("HI")
}
Как звонить demo
в test2
с test1
?
go fmt
? Вроде в терминале что ли? Как это показать, что он обо всем заботится?Ответы:
В
main
вашем пакете не может быть больше одного .В более общем смысле, у вас не может быть более одной функции с данным именем в пакете.
Удалите
main
intest2.go
и скомпилируйте приложение.demo
Функция будет видна сtest1.go
.источник
main
в test2.go, но не смог запустить test1.go с помощьюgo run test1.go
still. Зачем ?go run test1.go test2.go
Go Lang по умолчанию создает / запускает только указанный файл. Чтобы связать все файлы, вам нужно указать имена всех файлов при запуске.
Выполните любую из следующих двух команд:
$go run test1.go test2.go. //order of file doesn't matter $go run *.go
Вы должны сделать то же самое, если хотите их построить.
источник
go run *.go
чистый. Вот что мне было нужноЯ искал то же самое. Чтобы ответить на ваш вопрос « Как вызвать demo в test2 из test1? », Вот как я это сделал. Запустите этот код с помощью
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") }
источник
package lib; expected main
Если вы просто запустите,
go run test1.go
и этот файл содержит ссылку на функцию в другом файле в том же пакете, это приведет к ошибке, потому что вы не сказали Go запустить весь пакет, вы сказали ему запустить только этот один файл.Вы можете указать, что нужно запустить весь пакет, сгруппировав файлы в виде пакета в запуске, управляемом несколькими способами. Вот несколько примеров (если ваш терминал находится в каталоге вашего пакета):
go run ./
ИЛИ
go run test1.go test2.go
ИЛИ
go run *.go
Вы можете ожидать того же поведения при использовании команды сборки, и после запуска созданный исполняемый файл будет работать как сгруппированный пакет, где файлы знают о других функциях и т. Д. Пример:
go build ./
ИЛИ
go build test1.go test2.go
ИЛИ
go build *.go
А затем простой вызов исполняемого файла из командной строки даст вам результат, аналогичный использованию команды run, когда вы запускали все файлы вместе как единый пакет. Пример:
./test1
Или как бы то ни было, когда имя вашего исполняемого файла было вызвано при его создании.
источник
duplicate_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()]++ } }
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
источник