2016-09-22 33 views
7

The Go Ngôn ngữ lập trình phần Đặc điểm kỹ thuật trên Comparison operators dẫn tôi để tin rằng một struct chỉ chứa các lĩnh vực thể so sánh nên so sánh:Golang struct so

giá trị Struct có thể so sánh nếu tất cả các lĩnh vực của họ có thể so sánh. Hai giá trị cấu trúc bằng nhau nếu các trường không trống tương ứng của chúng bằng nhau.

Như vậy, tôi mong chờ đoạn mã sau để biên dịch vì tất cả các lĩnh vực trong "Sinh viên" struct có thể so sánh:

package main 

type Student struct { 
    Name string // "String values are comparable and ordered, lexically byte-wise." 
    Score uint8 // "Integer values are comparable and ordered, in the usual way." 
} 

func main() { 
    alice := Student{"Alice", 98} 
    carol := Student{"Carol", 72} 

    if alice >= carol { 
    println("Alice >= Carol") 
    } else { 
    println("Alice < Carol") 
    } 
} 

Tuy nhiên, nó fails to compile với thông điệp:

hoạt động không hợp lệ: alice> = carol (toán tử> = không được xác định trên cấu trúc)

Tôi đang thiếu gì?

Trả lời

14

Bạn là chính xác, cấu trúc là so sánh, nhưng không ra lệnh (spec):

Các nhà khai thác bình đẳng ==!= áp dụng đối với toán hạng mà có thể so sánh. Các toán tử đặt hàng <, <=, >>= áp dụng cho toán hạng được sắp xếp.

...

  • giá trị Struct là so sánh nếu tất cả các lĩnh vực của họ có thể so sánh. Hai giá trị cấu trúc bằng nhau nếu các trường không trống tương ứng của chúng bằng nhau.

>= là một nhà điều hành có trật tự, không phải là một so sánh.

1

Bạn phải xác định trường bạn đang so sánh để có được chương trình biên dịch.

if alice.Score >= carol.Score 

Sau đó, nó biên dịch và in

Alice> = Carol

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