无效操作:s [k](类型* S的索引)

时间:2013-04-11 02:32:42

标签: methods interface go

我想定义一个这样的类型:

type S map[string]interface{}

我希望在类型中添加一个方法:

func (s *S) Get( k string) (interface {}){
    return s[k]
}

当程序运行时,出现如下错误:

invalid operation: s[k] (index of type *S)

那么,如何定义类型并将方法添加到类型?

1 个答案:

答案 0 :(得分:10)

例如,

package main

import "fmt"

type S map[string]interface{}

func (s *S) Get(k string) interface{} {
    return (*s)[k]
}

func main() {
    s := S{"t": int(42)}
    fmt.Println(s)
    t := s.Get("t")
    fmt.Println(t)
}

输出:

map[t:42]
42

映射是引用类型,它包含指向底层映射的指针,因此通常不需要使用s的指针。我添加了一个(s S) Put方法来强调这一点。例如,

package main

import "fmt"

type S map[string]interface{}

func (s S) Get(k string) interface{} {
    return s[k]
}

func (s S) Put(k string, v interface{}) {
    s[k] = v
}

func main() {
    s := S{"t": int(42)}
    fmt.Println(s)
    t := s.Get("t")
    fmt.Println(t)
    s.Put("K", "V")
    fmt.Println(s)
}

输出:

map[t:42]
42
map[t:42 K:V]