2014-11-24 182 views

回答

3

更换

*v[i] = n 

(*v)[i] = n 

前者是指 “采取什么v[i]点”,而后者, “采取什么v点,并采取i“th元素”。

1

this answer所述,切片已经是一种指针,将指向切片的指针完全无用。

这意味着您的代码版本使用[]而不是指向[]的指针工作得很好。
this example

func (v VarBucket) AddOrReplace(n Var) VarBucket { 
    for i, vars := range v { 
     if vars.Name == n.Name { 
      v[i] = n 
      fmt.Println("Replaced") 
      return v 
     } 
    } 
    v = append(v, n) 
    fmt.Println("Added") 
    return v 
} 

有了:

v_a := Var{Name: "a", Value: "A"} 
v_b := Var{Name: "b", Value: "B"} 
v_c := Var{Name: "a", Value: "C"} 

b := VarBucket{} 
b = b.AddOrReplace(v_a) // add 
fmt.Printf("%v\n", b) 
b = b.AddOrReplace(v_b) // add 
fmt.Printf("%v\n", b) 
b = b.AddOrReplace(v_c) // replace v_a 
fmt.Printf("%v\n", b) 

输出:

Added 
[{a A}] 
Added 
[{a A} {b B}] 
Replaced 
[{a C} {b B}]