Подтвердить что ты не робот

Импорт пакетов в go

На языке программирования go, почему после импорта пакета мне все еще нужно префикс метода в этом пакете с именем пакета?

то есть.

import "io/ioutil"

func main() { 
    content, err = iotuil.ReadFile("somefile.txt")
    // etc..
}

Разве это не избыточно? Например, в Java вы можете делать такие вещи, как Files.readAllLines и т.д. Без импорта файлов.

4b9b3361

Ответ 1

Я предполагаю, что это на самом деле не отвечает на ваш вопрос, но если вы хотите, вы можете фактически вызвать методы без явного указания пакета - просто импортируйте с . перед именами (но это не рекомендуется; см. ниже):

package main

import (
  . "fmt"
  . "io/ioutil"
)

func main () {
  content, err := ReadFile("testfile")
  if err != nil {
    Println("Errors")
  }
  Println("My file:\n", string(content))
}

Обратите внимание на комментарий @jimt ниже - эта практика не рекомендуется не за пределами тестов, так как это может вызвать конфликты имен с будущими версиями. Кроме того, определенно согласитесь с точкой @DavidGrayson о том, как лучше читать/видеть, откуда происходят.

Ответ 2

вы можете импортировать и переименовывать имя пакета, например:

    import (  
        .     "fmt"       // no name, import in scope  
        File  "io/ioutil" // rename ioutil to File
        _     "net"       // net will not be available, but init() inside net package will be executed
    )

См. также https://golang.org/ref/spec#Import_declarations

Ответ 3

Я не могу действительно говорить для дизайнеров языка Go, но приятно иметь возможность быстро определить, где определяется метод, который вы вызываете. Также приятно видеть список всех пакетов, которые вы используете в верхней части файла. Это не избыточно.

Как вы сказали, Java требует, чтобы вы сказали Files.readAllLines, и аналогичным образом вам нужно написать ioutil.ReadFile.