Як викликати функцію з іншого файлу мовою go?


109

Я хочу викликати функцію з іншого файлу в 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? Як у терміналі чи що? Як це показує, що він про щось піклується?
Чарлі Паркер,

Відповіді:


78

У mainвашому пакеті не може бути більше одного .

Загальніше, ви не можете мати в пакеті більше однієї функції з заданим іменем.

Видаліть файл mainin test2.goскомпілюйте програму. demoФункція буде видно з test1.go.


1
Я можу будувати і запускати після видалення mainв test2.go, але не вдалося запустити test1.go, використовуючи go run test1.gostill. Чому?
Jeff Li

87
go run test1.go test2.go
Rich Churcher

2
@RichChurcher, ти дав відповідь. Дякую . Також слід використовувати верхній регістр Demo () , загальнодоступні функції мають великі регістри
Raymond Chenon

Якщо test2 має структуру, чи імпортуватиметься вона також?
Angger

@RaymondChenon Верхній регістр потрібен лише тоді, коли функцію потрібно використовувати в іншому пакеті. У цьому випадку, оскільки обидва файли знаходяться в одному пакеті `` main '', вони також можуть отримати доступ до `` не експортованих '' (читати приватних) функцій. Див. Tour.golang.org/basics/3
Зустріньте Сіноцзя

50

Go Lang за замовчуванням створює / запускає лише згаданий файл. Щоб зв’язати всі файли, потрібно вказати ім’я всіх файлів під час запуску.

Запустіть одну з двох команд:

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

Ви повинні зробити подібне, якщо хочете їх побудувати.


38

Я шукав те саме. Щоб відповісти на ваше запитання " Як викликати демонстрацію в test2 з test1? ", Ось як я це зробив. Запустіть цей код за допомогою go run test1.goкоманди. Змініть поточну_папку на папку, де знаходиться 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")
}

5
Переконайтеся, що назва методу написано з великої літери, інакше вона не буде працювати.
Макс.

1
Дякую за ваше рішення, це мені дуже допомогло! :)
jenkizenki

Вибачте , але це явно не працює:package lib; expected main
Madeo

0

Якщо ти просто біжиш go run test1.go і цей файл має посилання на функцію в іншому файлі того самого пакету, це призведе до помилки, оскільки ви не сказали Go запускати весь пакет, ви сказали йому запускати лише один файл.

Ви можете сказати 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

Або будь-яке інше ім'я вашого виконуваного файлу, яке випадково називається під час його створення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.