2010-11-26 20 views
5

जाओ विशिष्ट जानकारी states:मैं मानचित्र में [[16] बाइट] [] स्ट्रिंग कैसे बना सकता हूं?

The comparison operators == and != (§Comparison operators) must be fully defined for operands of the key type; thus the key type must not be a struct, array or slice. If the key type is an interface type, these comparison operators must be defined for the dynamic key values; failure will cause a run-time panic.

मैं जो Hash इंटरफ़ेस है, जो []byte रिटर्न से आते हैं हैश मान का एक नक्शा बनाने के लिए है, लेकिन जिसके लिए मेरे सभी हैश एक ही एल्गोरिथ्म के साथ किया जाता है (जिससे मुझे पता है इच्छा कि यह [16]byte में फिट होगा)। मैं उपयुक्त इंटरफ़ेस कैसे प्रदान कर सकता हूं जैसे map प्रकार []byte या [16]byte या उसके कुछ रैपर को कुंजी के रूप में उपयोग करने की अनुमति देगा?

वर्तमान में अपने प्रयोग निम्न त्रुटि उत्पन्न करता है:

dupes := make(map[[16]byte][]string) 
finddups.go:55: invalid map key type [16]uint8

अद्यतन (मार्च 2012): Go1 कुंजी प्रकार के रूप में [16]byte अनुमति देता है।

उत्तर

3

string type यूटीएफ -8 एन्कोडेड स्ट्रिंग मानों के सेट का प्रतिनिधित्व करता है। स्ट्रिंग बाइट्स के सरणी की तरह व्यवहार करते हैं। जाओ भाषा विशिष्टता के Conversions अनुभाग में एक स्ट्रिंग प्रकार विषय से रूपांतरणों में बाइट स्लाइस के लिए नियम 2 और 4 देखें।

package main 

import "fmt" 

func main() { 
    dupes := make(map[string][]string) 

    hash := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} 
    dupes[string(hash)] = []string{"a", "b"} 
    hash[len(hash)-1]++ 
    dupes[string(hash)] = []string{"b", "c"} 

    fmt.Println("len:", len(dupes)) 
    for k, v := range dupes { 
     fmt.Println("key:", []byte(k), "value:", v) 
    } 
} 

आउटपुट:

len: 2 
key: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 16] value: [b c] 
key: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15] value: [a b] 

नोट: यह एल्गोरिथ्म केवल स्ट्रिंग प्रकार और रूपांतरण The Go Language Specification में दी गई है, जो सभी कार्यान्वयन को पूरा करना चाहिए के लिए नियमों का लाभ लेता है। यह एक "चाल" है, जैसे कि var i int = '7' - '0' (एएससीआईआई, ईबीसीडीआईसी, यूनिकोड इत्यादि के लिए) एक संख्यात्मक चरित्र '7' को एक पूर्णांक मान 7 में परिवर्तित करने के लिए एक "चाल" है, गो और कई अन्य भाषाओं में।

+0

क्या आप यह समझाने में सक्षम हैं कि ऐसा क्यों है? यह एक जादू प्रकार में परिवर्तित करने के लिए मनमाना लगता है जो स्वीकार्य है। –

+0

@ मैट, यह बिल्कुल जादू नहीं है; गो स्पेक भी कहता है: 'स्ट्रिंग्स बाइट्स के सरणी की तरह व्यवहार करते हैं लेकिन अपरिवर्तनीय हैं'। इस प्रकार मैं पीटरसेओ से सहमत हूं कि यह उस रूपांतरण का स्वीकार्य उपयोग है। Http://golang.org/doc/go_spec.html#String_types – Poindexter

+0

@Poindexter देखें: यह असंभवता प्रतीत होता है कुंजी (पन इरादा नहीं है)। हाहाहा भी अच्छा नाम है। –

संबंधित मुद्दे