如何使用 Go 修复 Struct 中的问题?
How fix Issue in Struct using Go?
我在使用 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)
}
}
我的问题:
函数Add(),kvs[id]=kv
有错误!怎么解决?
Exist()
和Search()
的速度好吗?能不能做得更好?
我尝试将索引名称添加到代码中:type KeyVals []KeyVal
更改为:意思是:type KeyVals [interface{}]KeyVal
或 type KeyVals [string]KeyVal
... 但是错误!
1。在函数 Add() 中, kvs[id]=kv 有错误!怎么解决?
kvs
是类型 *KeyVals 它不支持索引
您可以使用
(*kvs)[id] = kv
2。 Exist() 和 Search() 的速度好吗?能不能做得更好?
您可以使用散列映射而不是数组来加快速度 search/exist functions.You 可以将 search
和 exist
组合到一个函数中。
3。我尝试将索引名称添加到代码中:键入 KeyVals []KeyVal 更改为:意思是:键入 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 : link
我在使用 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)
}
}
我的问题:
函数Add(),
kvs[id]=kv
有错误!怎么解决?Exist()
和Search()
的速度好吗?能不能做得更好?我尝试将索引名称添加到代码中:
type KeyVals []KeyVal
更改为:意思是:type KeyVals [interface{}]KeyVal
或type KeyVals [string]KeyVal
... 但是错误!
1。在函数 Add() 中, kvs[id]=kv 有错误!怎么解决?
kvs
是类型 *KeyVals 它不支持索引
您可以使用
(*kvs)[id] = kv
2。 Exist() 和 Search() 的速度好吗?能不能做得更好?
您可以使用散列映射而不是数组来加快速度 search/exist functions.You 可以将 search
和 exist
组合到一个函数中。
3。我尝试将索引名称添加到代码中:键入 KeyVals []KeyVal 更改为:意思是:键入 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 : link