2017-02-04 3 views
-1

У меня проблема в построении с помощью Go.Как исправить Problm в Struct с помощью Go?

пример кода:

package main 
import (
    "fmt" 
)  
type KeyVal struct { 
    Key interface{} 
    Value interface{} 
} 
type KeyVals []KeyVal 
func (kvs *KeyVals) AddOld(key interface{}, val interface{}) { 
    kv := KeyVal{key, val,typ} 
    *kvs = append(*kvs, kv) 
} 
func (kvs *KeyVals) Add(key interface{}, val interface{}){ 
    var flag,id = kvs.Exist(key) 
    if flag == true { 
     //kv := KeyVal{key,"Updated!"} 
     //*kvs=append(*kvs,kv) 
     //fmt.Println(*kvs[0].Key) 
     //update value of them 
     kv := KeyVal{key,val} 
     kvs[id]=kv 
     //*kvs[id]=kv 
     //fmt.Println("old set with id =",id,",","value =",kvs) 
    }else{ 
     kv := KeyVal{key, val} 
     *kvs = append(*kvs, kv) 
    } 
} 
func (kvs *KeyVals) Search(skey interface{}) (bool,interface{},interface{}) { 
    for n, kv := range *kvs { 
     key := kv.Key 
     val := kv.Value 
     if(key == skey){ 
      return true,n,val 
     } 
    } 
    return false,nil,nil 
} 
func (kvs *KeyVals) Exist(skey interface{})(bool,int) { 
    for n, kv := range *kvs { 
     key := kv.Key 
     if(key == skey){ 
      return true,n 
     } 
    } 
    return false,-1 
} 
func main() { 
    var kvs keyval.KeyVals 

    kvs.Add("key1","value1") 
    kvs.Add("key2","value2") 
    kvs.Add("key3","value3") 
    kvs.Add("key4",5) 
    kvs.Add("key5",5.2) 
    kvs.Add("key5","new....")//this should update value of this key. but not work! 


var flag,id,value = kvs.Search("key5") 
fmt.Println(flag,id,value) 


    for _, kv := range kvs { 
     key := kv.Key 
     val := kv.Value 

     fmt.Println("", key," ==> ", val) 
    } 
} 

Проблема мне:

1. в функции Add(), kvs[id]=kv есть ошибка! как исправить?

2. скорость Exist() и Search() хорошо? не может сделать лучше?

3. Я пытаюсь добавить индексное имя в код: type KeyVals []KeyVal изменить на: среднее: type KeyVals [interface{}]KeyVal или type KeyVals [string]KeyVal ... но ошибка!

tank you.

ответ

1

1. в функции Add(), kvs [id] = kv имеют ошибку! как исправить?

kvs имеет тип * KeyVals он не поддерживает индексацию Вы можете использовать

(*kvs)[id] = kv 

2. скорость Exist() и Search() хорошая? не может сделать лучше?

Вы можете использовать hashmap вместо массива для более быстрого поиска/существования функций. Вы можете комбинировать search и exist с одной функцией.

3. Я пытаюсь добавить имя индекса в код: type KeyVals [] KeyVal change to: mean: type KeyVals [interface {}] KeyVal или type KeyVals [string] KeyVal ... но ошибка!

Заявления типа являются wrong.Types ближе к тем, являются map[interface{}]interface{} или map [string]interface{}

Вот обновленный код, который работает, я использовал HashMap вместо массива и массива для отслеживания порядка

Код

package main 

import (
    "fmt" 
) 

type KeyVals struct { 
    keyVals  map[string]interface{} 
    KeysInOrder []string 
} 

func (kvs *KeyVals) Add(key string, val interface{}) { 
    if kvs.keyVals == nil { 
     kvs.keyVals = make(map[string]interface{}) 
    } 
    if _, ok := kvs.keyVals[key]; ok { 
     kvs.keyVals[key] = val 
     return 
    } 
    kvs.keyVals[key] = val 
    kvs.KeysInOrder = append(kvs.KeysInOrder, key) 
    return 
} 

func (kvs KeyVals) Search(key string) (interface{}, bool) { 
    val, found := kvs.keyVals[key] 
    return val, found 
} 

func main() { 
    var kvs KeyVals 
    kvs.Add("key1", "value1") 
    kvs.Add("key2", "value2") 
    kvs.Add("key3", "value3") 
    kvs.Add("key4", 5) 
    kvs.Add("key5", 5.2) 
    kvs.Add("key5", "new....") //this should update value of this key. but not work! 

    value, ok := kvs.Search("key5") 
    fmt.Println(value, ok) 

    for _, key := range kvs.KeysInOrder { 
     value, _ = kvs.Search(key) 
     fmt.Println(key, " ==> ", value) 
    } 
} 

Вот ссылка игры: link

+0

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/134847/discussion-on-answer-by-sarathsp-how-fix-problm-in-struct-using-go). –