2011-10-14 20 views
7

Tên biến chung cho các tệp hoặc thư mục là "đường dẫn". Thật không may đó cũng là tên của một gói trong Go. Bên cạnh đó, thay đổi đường dẫn làm tên đối số trong DoIt, làm cách nào để tôi lấy mã này để biên dịch?Làm cách nào để sử dụng tên biến có cùng tên với gói trong Go?

package main 

import (
    "path" 
    "os" 
) 

func main() { 
    DoIt("file.txt") 
} 

func DoIt(path string) { 
    path.Join(os.TempDir(), path) 
} 

Các lỗi tôi nhận được là:

$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) 

Trả lời

9

Các path string được shadowing các nhập khẩu path. Những gì bạn có thể làm là đặt bí danh của gói đã nhập thành ví dụ: pathpkg bằng cách thay đổi dòng "path" trong import vào pathpkg "path", vì vậy khi bắt đầu mã của bạn đi như thế này

package main 

import (
    pathpkg "path" 
    "os" 
) 

Tất nhiên sau đó bạn phải thay đổi mã DoIt thành:

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

tôi sợ rằng đó sẽ là câu trả lời ... Ước gì có một cách khác, nhưng tôi không thấy nó. – Nate

+0

Bạn biết những gì là loại mỉa mai? Mã gói đường dẫn không có giới hạn này. Nếu bạn nhìn vào path.Split (http://golang.org/src/pkg/path/path.go?s=2665:2707#L97), bạn sẽ thấy nó có một đối số có tên là path. đường dẫn được định nghĩa trong tệp, nhưng không được nhập ... – Nate

+3

Giới hạn này không áp dụng ở đó, bởi vì không có gói 'đường dẫn' được nhập và không có biến' đường dẫn' khác vào bóng, nhưng tôi có thể giả sử bạn đã biết điều đó. ;) – 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

Vâng, đó là cách rõ ràng để làm điều đó. Tôi đã tự hỏi nếu có một cách khác ... – Nate

+0

Tất nhiên nó không phải là những gì OP có nghĩa là. Câu trả lời của bạn hoàn toàn không liên quan. –