2011-09-08 12 views
5

Tôi có câu hỏi về công cụ gofmt của Go, định dạng tự động đầu ra của các chương trình theo thông số Go chính thức (ví dụ: bạn không thể tranh luận về vị trí đặt trong Go, vì điều đó dường như được cố định bởi thông số kỹ thuật) .Các vấn đề gofmt và diff/VCS của Go?

Trên trang sau:

http://golang.org/doc/effective_go.html 

theo "định dạng" đoạn, nó được viết rằng:

Như một ví dụ, không có cần phải dành nhiều thời gian xếp hàng các ý kiến ​​trên các lĩnh vực của một cấu trúc. Gofmt sẽ làm điều đó cho bạn. Với khai

type T struct { 
    name string // name of the object 
    value int // its value 
} 

gofmt sẽ xếp hàng các cột:

type T struct { 
    name string // name of the object 
    value int // its value 
} 

Tuy nhiên tôi không hiểu tại sao này có thể có thể chơi đẹp với diff và VCSes.

Ví dụ, nếu tôi có một dòng sản phẩm mới:

confuzzabler int // doo doo be doo 

và chạy một diff, tôi nên có được điều này:

2d1 
<  confuzzabler int // doo doo be doo 
7d5 
< 

Và cuộc sống sẽ là tất cả tốt: các chương trình diff dòng duy nhất đã thay đổi.

Tuy nhiên nếu tôi lại chạy gofmt Tôi nhận điều này:

type T struct { 
    confuzzabler int // doo doo be doo 
    name   string // name of the object 
    value  int // its value 
} 

Và bây giờ tôi lại chạy diff và tôi có được điều này:

2,4c2,3 
<  confuzzabler int // doo doo be doo 
<  name   string // name of the object 
<  value  int // its value 
--- 
>  name string // name of the object 
>  value int // its value 
7d5 
< 

Đó là một cao khó hiểu và gây hiểu lầm diff đầu ra vì chỉ có một dòng thay đổi.

Làm thế nào để bạn đối phó với điều này với tư cách là nhà phát triển Go?

+2

Trước đó được bình chọn là "Offtopic" vui lòng đọc FAQ SO đây: http://stackoverflow.com/faq trong đó nêu rõ rằng SO là "đúng nơi" [sic] để đặt câu hỏi về lập trình công cụ (Tôi phải nêu rõ điều này vì gần đây tôi đã có câu hỏi về một công cụ được giảm giá và ai đó đã bỏ phiếu để đóng nó ... Không có khóa học nào đề xuất bất kỳ nơi nào khác để đăng câu hỏi của tôi). – SyntaxT3rr0r

+0

Tôi nhận thấy điều này phần lớn làm nổi bật những thiếu sót của các công cụ * diff * quá ngu ngốc để hiểu rằng cả hai mã nguồn thực sự chính xác giống như chương trình Go nhưng tôi vẫn muốn biết cách xử lý vấn đề * gofmt * này. – SyntaxT3rr0r

+1

@ Jonathan Leffler: nếu bạn đọc kỹ câu hỏi của tôi, bạn sẽ thấy rằng đó chính xác là ** vấn đề tôi mô tả. Thực hiện thay đổi nhỏ đối với mã nguồn, do bản chất của * gofmt *, có thể làm cho * gofmt * thay đổi nhiều dòng mã ngay cả khi bạn chỉ thay đổi một dòng (vì nó sắp xếp lại ** tất cả ** dòng của bạn, chứ không phải chỉ là cái bạn đã thêm). Đây là cái gì đó thường thúc đẩy các nhà phát triển hạt bởi vì nó tạo ra sự khác biệt "không có gì". Chỉ cần nhìn xem có bao nhiêu người ở đây trên SO phàn nàn về những người làm kiểu liên kết mà * gofmt * làm "bởi vì nó làm rối loạn sự khác biệt". – SyntaxT3rr0r

Trả lời

0

So sánh đầu ra khác biệt, rõ ràng điều gì đã xảy ra. Nó không gây nhầm lẫn hay gây nhầm lẫn.

5
$ diff --help|grep -i white 
    -b --ignore-space-change Ignore changes in the amount of white space. 
    -w --ignore-all-space Ignore all white space. 

Đối với các vấn đề với VCS, nếu bạn đã định dạng mã cho mình sau một số ước thành lập (hãy giả sử ở đây ước đây là những gì gofmt sau), bạn sẽ phải tự định dạng lại các khoảng trắng trong mã khối một cách chính xác gofmt đã làm và thay đổi này sẽ được tính bởi bất kỳ VCS nào dưới dạng thay đổi. Vì vậy, tôi không thấy bất kỳ vấn đề với ngữ nghĩa trong trường hợp này, thực sự. Thay vào đó, nếu bạn quan tâm đến các công cụ tìm khác biệt do VCS cung cấp, có lẽ bạn nên xem liệu chúng có hỗ trợ bỏ qua các thay đổi khoảng trắng như GNU diff đã đề cập ở trên không. FWIW git diff hỗ trợ điều này với cùng một tùy chọn dòng lệnh -b.

+1

+1 nhưng ... Nếu tôi làm * string a = "kostix" * và sau đó thay đổi thành * string a = "kostix" * (chú ý không gian bổ sung ở cuối, từ một đến hai khoảng trắng). * diff -b * không đủ thông minh để hiểu sự khác biệt giữa không gian có ý nghĩa và không gian có ý nghĩa. Vì vậy, -1 thực sự;) – SyntaxT3rr0r

+0

Có vẻ như bạn quan tâm nhiều hơn đến việc nhấp chuột hơn là với sự cố trong tầm tay. – kostix

5

tiêu chuẩn dự án Go-based của bạn nên ra lệnh gì đó như:

Trước khi bất kỳ mã Go cam kết VCS, nó được định dạng với gofmt. Đây là định dạng duy nhất được chấp nhận.

Sau đó không có đối số; nếu mã đi qua gofmt không đổi, tất cả đều tốt. Nếu nó thay đổi khi được chuyển qua gofmt, thì hãy sử dụng đầu ra từ gofmt. Những gì bạn làm trong khi chỉnh sửa tùy thuộc vào bạn (tùy thuộc vào các tiêu chuẩn mã hóa khác), nhưng đây là yêu cầu đối với bất kỳ mã nào được kiểm tra trong VCS của bạn.

1

Nếu điều này thực sự làm phiền bạn, hãy thực hiện hai lần đăng ký.

Séc đầu tiên thêm confuzzabler. Nhận xét hợp lý là "Thêm biến mới vào T". Sự khác biệt của bạn sẽ được tách biệt với mã bạn thực sự đã thay đổi.

Sau đó, thực hiện gofmt.

Cam kết thứ hai chỉ là thay đổi định dạng và thông điệp cam kết hợp lý sẽ là "gofmt". Sự khác biệt ở đây sẽ chỉ là mã mà gofmt đã thay đổi.