2011-11-09 17 views
9

Sto provando a creare una mappa in Go che è composta da grandi numeri interi. Esplicitamente Go dice esplicitamente che:Tipi di dati complessi come chiavi nelle mappe in Go

Le strutture, le matrici e le porzioni non possono essere utilizzate come chiavi di mappa, poiché l'uguaglianza non è definita su questi tipi.

che ha senso. Naturalmente potrei convertire i grandi numeri interi in stringhe e usare la stringa come chiave, ma sto cercando una soluzione più generale qui. Posso avvolgere la mia struttura in qualcosa (un'interfaccia?) Che implementa una funzione di uguaglianza e usarla invece?

il codice di esempio che, ovviamente, non funziona:

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

non è solo l'uguaglianza. 'map' è una tabella hash, quindi ogni tipo di chiave necessita anche di una funzione hash – newacct

+0

True. E ho dimenticato che dal momento che big.Int è mutabile (che non mi piace) metterli in tabelle hash potrebbe non essere così intelligente. Forse dovrei solo attenermi alla programmazione funzionale :) – Olof

risposta

7

Le regole di uguaglianza stanno per cambiare presto. Dalla Go 1 plan:

Go 1 definiranno parità sui valori struct e matrice costituita da campi su cui parità è anche definito (confronto elemento saggio). Rimuoverà l'uguaglianza sui valori delle funzioni e delle mappe ad eccezione del confronto con zero. Go 1 continuerà a escludere l'uguaglianza per le porzioni . (Nel caso generale è praticamente impossibile.)

Tuttavia, anche con queste regole, non è possibile utilizzare *BigInt come chiave, in quanto contiene una fetta. Si noti inoltre che non è possibile in Go scrivere un operatore di uguaglianza personalizzato (né è possibile sovrascrivere nessun altro operatore). Ma in realtà è un punto di forza di Go secondo me - le cose sono semplicemente più semplici senza di essa.

Quindi, sarà necessario utilizzare le stringhe per le chiavi. Le stringhe tuttavia non hanno bisogno di essere formattate in decimali (o in qualsiasi altro formato) purché non si desideri stamparle. Quindi il modo più veloce è probabilmente utilizzare il metodo Bytes() (che scarterà anche il segno, assicurati di includerlo separatamente nella stringa).

Problemi correlati