先来看个简单的go程序:
package main import ( "fmt" ) type TaskIntf interface { Process() } type Task struct { TaskId string X int Y int } func (p *Task)Process() { fmt.Printf("%+v\n", p) } func main() { var t TaskIntf = new(Task) fmt.Printf("%T\n", t) t.Process() fmt.Printf("%+v\n", t) }
再看:
package main import ( "fmt" ) type TaskIntf interface { Process() } type Task struct { TaskId string X int Y int } func (p *Task)Process() { fmt.Printf("%+v\n", p) } func main() { var t TaskIntf = new(Task) fmt.Printf("%T\n", t) t.X = 1 t.Process() fmt.Printf("%+v\n", t) }
结果出现编译错误:
t.X undefined (type TaskIntf has no field or method X)
注意到, 对于t而言,静态类型是TaskIntf, 动态类型(运行时)是Task. 而在t.X = 1时,编译器会进行静态检查, 故编译错误。 那怎么办呢? 提供三种方式:
第一是使用断言:
package main import ( "fmt" ) type TaskIntf interface { Process() } type Task struct { TaskId string X int Y int } func (p *Task)Process() { fmt.Printf("%+v\n", p) } func main() { var t TaskIntf = new(Task) fmt.Printf("%T\n", t) t.(*Task).X = 1 t.Process() fmt.Printf("%+v\n", t) }
结果:
*main.Task &{TaskId: X:1 Y:0} &{TaskId: X:1 Y:0}
也可以这么搞:
package main import ( "fmt" "encoding/json" ) type TaskIntf interface { Process() } type Task struct { TaskId string X int Y int } func (p *Task)Process() { fmt.Printf("%+v\n", p) } func main() { var t TaskIntf = new(Task) fmt.Printf("%T\n", t) str_json := `{"taskid":"xxxxxx", "x":1, "y":2}` json.Unmarshal([]byte(str_json), t) t.Process() fmt.Printf("%+v\n", t) }
结果:
*main.Task &{TaskId:xxxxxx X:1 Y:2} &{TaskId:xxxxxx X:1 Y:2}
还可以这么搞:
package main import ( "fmt" ) type TaskIntf interface { Process() GetTask() *Task } type Task struct { TaskId string X int Y int } func (p *Task) Process() { fmt.Printf("%+v\n", p) } func (p *Task) GetTask() *Task { return p } func main() { var t TaskIntf = new(Task) fmt.Printf("%T\n", t) t.GetTask().TaskId = "xxxxxx" t.GetTask().X = 1 t.GetTask().Y = 2 t.Process() fmt.Printf("%+v\n", t) }
*main.Task &{TaskId:xxxxxx X:1 Y:2} &{TaskId:xxxxxx X:1 Y:2}
更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。
程序员编程交流QQ群:805358732
如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!