2013-04-11 26 views
5

Tôi muốn xác định một loại như thế này:hoạt động không hợp lệ: s [k] (chỉ số của loại * S)

type S map[string]interface{} 

và tôi muốn thêm một phương pháp để loại như thế này:

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

khi chương trình chạy, có một lỗi như thế này:

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

Vì vậy, làm thế nào để xác định loại và thêm phương pháp để loại?

Trả lời

10

Ví dụ,

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) 
} 

Output:

map[t:42] 
42 

Maps là kiểu tham chiếu, trong đó có chứa một con trỏ đến các bản đồ bên dưới, vì vậy bạn thường sẽ không cần phải sử dụng một con trỏ cho s . Tôi đã thêm phương thức để nhấn mạnh điểm. Ví dụ,

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) 
} 

Output:

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

lẽ expound một chút trên con trỏ vs nhận giá trị, và tại sao bản đồ có thể làm việc với một máy thu giá trị? – cthom06

Các vấn đề liên quan