Как вызвать функцию из другого файла на языке Go?


113

Я хочу вызвать функцию из другого файла на 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? Вроде в терминале что ли? Как это показать, что он обо всем заботится?
Чарли Паркер

Ответы:


84

В mainвашем пакете не может быть больше одного .

В более общем смысле, у вас не может быть более одной функции с данным именем в пакете.

Удалите mainin test2.goи скомпилируйте приложение. demoФункция будет видна с test1.go.


1
Я могу собрать и запустить после удаления mainв test2.go, но не смог запустить test1.go с помощью go run test1.gostill. Зачем ?
Джефф Ли

89
go run test1.go test2.go
Rich Churcher

2
@RichChurcher, ты дал ответ. Спасибо . Также вы должны использовать Demo () в верхнем регистре , публичные функции по соглашению имеют верхний регистр
Раймонд Шенон,

Если у test2 есть структура, будет ли она импортирована?
Angger 04

@RaymondChenon Верхний регистр требуется только тогда, когда функция должна использоваться в другом пакете. В этом случае, поскольку оба файла находятся в одном и том же пакете «main», они также могут получить доступ к «неэкспортированным» (частным) функциям. См. Tour.golang.org/basics/3
Встречайте Sinojia

56

Go Lang по умолчанию создает / запускает только указанный файл. Чтобы связать все файлы, вам нужно указать имена всех файлов при запуске.

Выполните любую из следующих двух команд:

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

Вы должны сделать то же самое, если хотите их построить.


1
go run *.goчистый. Вот что мне было нужно
Алиф Рамдани

40

Я искал то же самое. Чтобы ответить на ваш вопрос « Как вызвать 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")
}

6
Убедитесь, что имя метода написано с большой буквы, иначе он не сработает.
Макс

1
Спасибо за решение, мне оно очень помогло! :)
jenkizenki

Извините, но это явно не работает:package lib; expected main
Мадео

Здесь играет роль структура папок.
Билл Зеленко

0

Если вы просто запустите, 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

Или как бы то ни было, когда имя вашего исполняемого файла было вызвано при его создании.


0
Структура папки

дублировать
  |
  | --duplicate_main.go
  |
  | --countLines.go
  |
  | --abc.txt

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()]++
        }
    }
  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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.