2011-11-09 27 views
9

Tôi đang cố gắng tạo bản đồ trong Go được khóa bằng số nguyên lớn. Hiệu quả Hãy nói rõ ràng rằng:Các kiểu dữ liệu phức tạp như các phím trong bản đồ trong Go

Không thể sử dụng khóa bản đồ, mảng và lát làm khóa bản đồ vì tính bình đẳng không được xác định trên các loại đó.

có ý nghĩa. Tất nhiên tôi có thể chuyển đổi các số nguyên lớn thành chuỗi và sử dụng chuỗi làm khóa, nhưng tôi đang tìm một giải pháp tổng quát hơn ở đây. Tôi có thể bọc cấu trúc của tôi vào một cái gì đó (một giao diện?) Mà thực hiện một chức năng bình đẳng và sử dụng mà thay vào đó?

Ví dụ mã mà, tất nhiên, không hoạt động:

package main                           

import (                            
     "big"                           
     "fmt"                           
)                              

func main() {                           
     one1 := big.NewInt(1)                       
     one2 := big.NewInt(1)                       

     hmap := make(map[*big.Int] int)                     
     hmap[one1] = 2                         
     _, exists := hmap[one2]                       
     fmt.Printf("Exists=%v\n", exists)                    
}                              
+2

không chỉ là bình đẳng. 'map' là một bảng băm, do đó, mỗi loại khóa cũng cần hàm băm – newacct

+0

True. Và tôi quên rằng kể từ big.Int là mutable (mà tôi không thích) đặt chúng trong bảng băm có thể không được thông minh. Có lẽ tôi chỉ nên gắn bó với lập trình hàm :) – Olof

Trả lời

7

Các quy tắc về bình đẳng sẽ thay đổi sớm. Từ Go 1 plan:

Go 1 sẽ xác định sự bình đẳng về giá trị struct và mảng sáng tác từ lĩnh vực mà sự bình đẳng cũng được định nghĩa (yếu tố khôn ngoan so sánh). Nó sẽ loại bỏ sự bình đẳng về các giá trị hàm và bản đồ ngoại trừ so sánh với số không. Go 1 sẽ tiếp tục loại trừ sự bình đẳng cho lát. (Trong trường hợp chung, điều đó là không khả thi.)

Tuy nhiên, ngay cả với quy tắc này, bạn không thể sử dụng *BigInt làm khóa. Cũng lưu ý rằng không thể thực hiện trong Go để viết toán tử bình đẳng tùy chỉnh (không thể ghi đè lên bất kỳ toán tử nào khác). Nhưng đó thực sự là một sức mạnh của Go trong quan điểm của tôi - mọi thứ đơn giản hơn mà không có nó.

Vì vậy, bạn sẽ phải sử dụng chuỗi cho khóa của mình. Tuy nhiên, các chuỗi không cần phải được định dạng theo dạng thập phân (hoặc bất kỳ định dạng nào khác) miễn là bạn không muốn in chúng. Vì vậy, cách nhanh nhất có lẽ là sử dụng phương thức Bytes() (cũng sẽ loại bỏ dấu hiệu, đảm bảo bao gồm dấu tách biệt trong chuỗi của bạn).

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