2012-09-18 26 views
6

Tôi đã mã sau:Làm thế nào để đặt bất kỳ giá trị để giao tiếp {}

package main 

import (
    "fmt" 
) 

type Point struct { 
    x,y int 
} 

func decode(value interface{}) { 
    fmt.Println(value) // -> &{0,0} 

    // This is simplified example, instead of value of Point type, there 
    // can be value of any type. 
    value = &Point{10,10} 
} 

func main() { 
    var p = new(Point) 
    decode(p) 

    fmt.Printf("x=%d, y=%d", p.x, p.y) // -> x=0, y=0, expected x=10, y=10 
} 

Tôi muốn thiết lập giá trị của bất kỳ loại với giá trị truyền cho decode chức năng. Có thể trong Go, hay tôi hiểu nhầm điều gì đó?

http://play.golang.org/p/AjZHW54vEa

+1

Go là pass-by-value . Gán cái gì đó cho một biến cục bộ không bao giờ ảnh hưởng đến bên ngoài. Bạn có thể sử dụng một kiểu tham chiếu (như một con trỏ) để thay đổi thứ mà nó trỏ đến để chia sẻ trạng thái; nhưng sau đó nó sẽ cần đến một con trỏ của đúng loại để bạn có thể gán một cái gì đó cho điều nó trỏ đến. – newacct

Trả lời

5

quát, chỉ using reflection:

package main 

import (
    "fmt" 
    "reflect" 
) 

type Point struct { 
    x, y int 
} 

func decode(value interface{}) { 
    v := reflect.ValueOf(value) 
    for v.Kind() == reflect.Ptr { 
     v = v.Elem() 
    } 
    n := reflect.ValueOf(Point{10, 10}) 
    v.Set(n) 
} 

func main() { 
    var p = new(Point) 
    decode(p) 
    fmt.Printf("x=%d, y=%d", p.x, p.y) 
} 
+0

Đó là điều tôi cần, cảm ơn bạn! –

1

Tôi không chắc chắn về mục tiêu chính xác của bạn.

Nếu bạn muốn assert rằng value là một con trỏ đến Point và thay đổi nó, bạn có thể làm điều đó:

func decode(value interface{}) { 
    p := value.(*Point) 
    p.x=10 
    p.y=10 
} 
+1

bạn cũng có thể thay đổi điểm hiện tại bằng 'p: = value. (* Point); * p = Điểm {20, 20} ' – newacct

+0

@newacct Hum ... bạn hoàn toàn đúng ... Tôi đã làm sạch câu trả lời của tôi. Nhưng vì tôi vẫn không hiểu được ý định thực sự của OP, tôi có thể loại bỏ toàn bộ câu trả lời trong một vài ngày. –

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