Как использовать имя переменной с тем же именем, что и у пакета в Go?

Обычное имя переменной для файлов или каталогов — «путь». К сожалению, это также имя пакета в Go. Кроме того, изменив путь в качестве имени аргумента в 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)

person Nate    schedule 14.10.2011    source источник


Ответы (2)


path string затеняет импортированный path. Что вы можете сделать, так это установить псевдоним импортированного пакета, например. pathpkg, изменив строку "path" в import на pathpkg "path", чтобы начало вашего кода выглядело так

package main

import (
    pathpkg "path"
    "os"
)

Конечно, тогда вам нужно изменить код DoIt на:

pathpkg.Join(os.TempDir(), path)
person macbirdie    schedule 14.10.2011
comment
Я боялся, что это будет ответ... Хотелось бы другого пути, но я его не вижу. - person Nate; 14.10.2011
comment
Знаете, что такое ирония? Код пакета пути не имеет этого ограничения. Если вы посмотрите на path.Split (golang. org/src/pkg/path/path.go?s=2665:2707#L97), вы увидите, что у него есть аргумент с именем path. путь определен в файле, но не импортирован... - person Nate; 14.10.2011
comment
Это ограничение здесь не применяется, потому что нет импортированного пакета path и нет другой переменной path для теневого копирования, но я могу предположить, что вы уже это знаете. ;) - person macbirdie; 14.10.2011
comment
Да, я понимаю, почему, но мне это показалось забавным... да ладно, я думаю, мы должны иметь дело с ограничением. - person Nate; 16.10.2011

person    schedule
comment
Да, это очевидный способ сделать это. Я просто подумал, есть ли другой способ... - person Nate; 16.10.2011
comment
Конечно, это было не то, что имел в виду ОП. Ваш ответ совершенно не важен. - person Mateus Felipe; 09.02.2018