2012-05-02 27 views
12

Tôi đang chơi với Google Go và tôi đang vui vẻ (!), Nhưng tôi đang gặp một số vấn đề với hệ thống phụ gói.Xây dựng và tham khảo gói địa phương của riêng tôi ở số

Tôi đang chạy Đi 1.0.1 trên Mac OS X Lion. Tôi cũng xây dựng các chương trình tập tin đơn lẻ khác nhau mà không có vấn đề gì (tôi cũng xây dựng một webapp nhỏ bằng cách sử dụng html/templates mà không có vấn đề gì và nó biên dịch và chạy mà không có bất kỳ lỗi nào).

tôi đã xác định một "tái sử dụng" gói (even.go):

package even 

func Even(i int) bool { 
    return i % 2 == 0 
} 

func Odd(i int) bool { 
    return i % 2 == 1 
} 

và một chương trình tiêu dùng (useeven.go):

package main 

import (
    "./even" 
    "fmt" 
) 

func main() { 
    a := 5 
    b := 6 

    fmt.Printf("%d is even %v?\n", a, even.Even(a)) 
    fmt.Printf("%d is odd %v?\n", b, even.Odd(b)) 
} 

Nhưng khi tôi biên dịch "thư viện "sử dụng

go build even.go 

Tôi không có gì ... Không có lỗi, không có thông báo ... Điều gì sẽ xảy ra?

Tôi nên làm như thế nào?

+0

điều gì xảy ra sau đó? bạn có thể rõ ràng hơn không? nó có biên dịch thành công không? có thể thực thi được không? – Chaos

+0

không, không thể thực thi được. không, không có thông báo đầu ra ... – gsscoder

Trả lời

9

Câu trả lời cho câu hỏi của bạn, "Tôi nên làm như thế nào?" được giải thích trong How to Write Go Code. Nó thực sự là công cụ khá quan trọng và là một nền tảng bạn nên có trước khi đi xa hơn nhiều.

Hành vi của go build có vẻ khó hiểu, nhưng thực sự là thông thường cho các chương trình dòng lệnh - không có đầu ra có nghĩa là chương trình đã chạy thành công. Vậy nó đã làm gì? Cho rằng bạn có thể đọc các tài liệu. go help build giải thích,

... Nếu không, hãy biên soạn các gói nhưng hủy kết quả, chỉ phục vụ kiểm tra gói có thể được xây dựng.

Điều gì, bạn muốn nhiều hơn? Tất nhiên. "Cách viết mã Go" giải thích những cách tốt để làm điều này. Để khắc phục nhanh chương trình của bạn, tôi sẽ giải thích rằng lệnh go mong đợi mỗi gói và mỗi chương trình thực thi nằm trong một thư mục riêng biệt. Nếu bạn chỉ cần thực hiện một thư mục được gọi là ngay cả, ngay lập tức dưới vị trí của useeven.go, và di chuyển even.go với nó, sau đó go run useeven.go nên chạy như bạn có nó.

+1

Tôi đã tạo một thư mục có tên ** ngay cả ** và được di chuyển ** even.go ** bên trong. Bây giờ tôi có thể xây dựng và chạy chương trình. Sau đó (cho mục đích học tập) Tôi đã đổi tên ** thậm chí ** thành ** _ thậm chí **. Các thực thi vẫn còn làm việc nhưng khi tôi sử dụng 'đi chạy useeven.go' nó không thành công. Tôi nghĩ rằng đây là một bằng chứng cho thấy rằng ** useeven ** executable chứa sau đó module ** even.go ** được nhúng vào trong ảnh thùng rác của nó. Tôi luôn luôn đọc tài liệu trước khi đi để chơi mã, nhưng tôi mới đến ngôn ngữ này và trong tài liệu này điểm (đối với tôi) là không thực sự rõ ràng. Có lẽ để có được một số loại liên kết _dynamic tại thời gian chạy, chúng ta cần 'đi install' module. Đúng không? – gsscoder

+1

Không. Hiện tại, các chương trình Go luôn được liên kết tĩnh và không có cách nào để có các gói Go được liên kết động vào thời gian chạy. 'go install' sử dụng' GOPATH', như được giải thích trong tài liệu, để các thông số kỹ thuật hệ thống tập tin như "./" có thể tránh được trong đường dẫn nhập. – Sonia

+0

OK, bây giờ điểm này là rõ ràng. Dù sao tôi mong đợi ngôn ngữ này phát triển. Tôi thấy nó rất rõ ràng, rõ ràng và tổng hợp. Tôi hy vọng rằng thư viện gói sẽ phát triển để mở rộng việc sử dụng trong nhiều lĩnh vực hơn và nhiều hơn nữa. – gsscoder

2

go build chỉ tạo tệp đầu ra khi nó tạo một "gói chính duy nhất". Nếu bạn muốn xuất tệp cho gói khác của mình, bạn nên sử dụng go install. Điều đó sẽ xây dựng và cài đặt gói đó vào thư mục pkgs của bạn.

Các vấn đề liên quan