2017-02-04 23 views
-1

我在Struct中使用Go有問題。如何在使用Go的Struct中修復Problm?

示例代碼:

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{}]KeyValtype KeyVals [string]KeyVal ...但錯誤!

坦克你。

回答

1

1。在函數Add()中,kvs [id] = kv有錯誤!如何修復?

kvs類型爲* KeyVals它不支持索引 您可以使用

(*kvs)[id] = kv 

2。 Exist()和Search()的速度很好?不能做得更好?

您可以使用散列圖代替數組以獲得更快的搜索/存在功能。您可以將searchexist組合成一個函數。

3。我試着給代碼添加索引名稱:type KeyVals [] KeyVal change to:mean:type KeyVals [interface {}] KeyVal或類型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)。 –