#package #go #variable-names
#пакет #Вперед #имена переменных
Вопрос:
Общим именем переменной для файлов или каталогов является «path». К сожалению, это также имя пакета в Go. Кроме того, изменяя path в качестве имени аргумента в DoIt, как мне скомпилировать этот код?
package main
import (
"path"
"os"
)
func main() {
DoIt("file.txt")
}
func DoIt(path string) {
path.Join(os.TempDir(), path)
}
Ошибка, которую я получаю,:
$6g pathvar.go
pathvar.go:4: imported and not used: path
pathvar.go:13: path.Join undefined (type string has no field or method Join)
Ответ №1:
Это path string
затенение импортируемого path
. Что вы можете сделать, это установить псевдоним импортируемого пакета, например, pathpkg , изменив строку "path"
в import
into pathpkg "path"
, чтобы начало вашего кода выглядело так
package main
import (
pathpkg "path"
"os"
)
Конечно, тогда вам нужно изменить DoIt
код на:
pathpkg.Join(os.TempDir(), path)
Комментарии:
1. Я боялся, что это будет ответ… Хотелось бы, чтобы был другой способ, но я его не вижу.
2. Знаете, в чем ирония? Код пакета path не имеет этого ограничения. Если вы посмотрите на path . Разделить ( golang.org/src/pkg/path/path.go?s=2665:2707#L97 ), вы увидите, что у него есть аргумент с именем path . путь определен в файле, но не импортирован…
3. Это ограничение там не применяется, потому что нет
path
импортированного пакета и нет другойpath
переменной для shadow, но я могу предположить, что вы это уже знаете. 😉4. Да, я понимаю почему, но нашел это забавным… ну что ж, я думаю, нам придется иметь дело с ограничением.
Ответ №2:
package main
import (
"path"
"os"
)
func main() {
DoIt("file.txt")
}
// Just don't introduce a same named thing in the scope
// where you need to use the package qualifier.
func DoIt(pth string) {
path.Join(os.TempDir(), pth)
}
Комментарии:
1. Да, это очевидный способ сделать это. Мне просто интересно, есть ли другой способ…
2. Конечно, это было не то, что имел в виду OP. Ваш ответ совершенно не имеет значения.