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

#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. Ваш ответ совершенно не имеет значения.