Открытие файла go внутри другой программы go - PullRequest
0 голосов
/ 21 октября 2019

Я учусь на Go, используя книгу «Язык программирования Go». В первой главе представлен модуль os.Open для чтения файлов. Я попытался открыть файл go, как показано ниже.

  f, err = os.Open("helloworld.go")

Я получил следующую ошибку:

   # command-line-arguments
.\helloworld.go:6:6: main redeclared in this block
        previous declaration at .\dup2.go:10:6

Я хочу понять, почему Go ведет себя так, как будто он пытается скомпилировать файл вместо чтениякак и другие языки (Python, Java или C).

Как правильно открыть файл?

Ответы [ 2 ]

6 голосов
/ 21 октября 2019

Полученная ошибка указывает на то, что в одном пакете имеется функция 2 main().
В пакете может быть много файлов. Если в одном каталоге, в котором вы запускаете команду go build, есть несколько файлов .go, компилятор создаст пакет main. В этом случае он обнаружил дублированную функцию main(), следовательно, сборка не удалась.

Что вы хотите сделать, это указать, какой файл вы хотите построить:

go build helloworld.go

С указанным файлом go build будет собираться только из файлов, которые вы перечислили.

Для получения дополнительной информации о go build вы можете обратиться к Документация Голанга .

0 голосов
/ 22 октября 2019

Хотя вы не должны этого делать, но технически вы можете прочитать файл '.go' с помощью main () из другого файла .go. Ваш случай терпит неудачу, так как вы создаете пакет с несколькими файлами, определяющими main.

Снова поясняем, что не рекомендуется иметь несколько файлов с main в одном пакете, и он потерпит неудачу при сборке пакета. Это так, так как в пакете должна быть только одна точка входа (функция main ()).

По техническим соображениям вы можете прочитать файл go из другого в том же пакете, но в этом случае вам нужнопостроить только файл (не весь пакет). Вы также можете выполнить команду go run

$ cat main1.go 
package main

import "fmt"

func main() {
        fmt.Println("Hello")
}
$
$ cat readinfolder.go 
package main

import (
        "bufio"
        "fmt"
        "os"
)

func main() {
        filehandle, err := os.Open("main1.go")
        if err != nil {
                panic(err)
        }
        defer filehandle.Close()
        scanner := bufio.NewScanner(filehandle)
        for scanner.Scan() {
                fmt.Println(scanner.Text())
        }
}
$
$
$ go build readinfolder.go 
$ ./readinfolder 
package main

import "fmt"

func main() {
        fmt.Println("Hello")
}
$ 


.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...