2011-10-14 15 views
7

ファイルまたはディレクトリの一般的な変数名は "path"です。残念ながら、それはGoのパッケージの名前でもあります。 DoItの引数名としてパスを変更すると、このコードをコンパイルするにはどうすればよいですか?Goのパッケージと同じ名前の変数名はどのように使用しますか?

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) 

答えて

9

path stringがインポートpathをシャドウイングされます。あなたができることは、インポートされたパッケージのエイリアスを例えばに設定します。私がいた

pathpkg.Join(os.TempDir(), path) 
+0

pathpkg "path"importにライン"path"を変更するので、あなたのコードの開始はもちろん、この

package main import ( pathpkg "path" "os" ) 

ようになり、あなたがにDoItコードを変更する必要があることでpathpkg恐ろしいことが答えになるだろう...別の方法がありましたら願っていますが、私はそれを見ていません。 – Nate

+0

あなたは皮肉なことが何であるか知っていますか?パスパッケージコードにはこの制限はありません。 path.Split(http://golang.org/src/pkg/path/path.go?s=2665:2707#L97)を見ると、pathという名前の引数があることがわかります。パスはファイルに定義されていますが、インポートされません... – Nate

+3

この制限はそこには適用されません。 'path'というパッケージはインポートされておらず、' shadow'変数もありません。 ;) – macbirdie

0
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) 
} 
+0

うん、それはそれを行う明らかな方法です。私はちょうど別の方法があるかどうか疑問に思っていた... – Nate

+0

もちろん、OPが意味するものではなかった。あなたの答えはまったく無関係です。 –

関連する問題