go的静态类型和动态类型
2018-11-16 20:17
197 查看
版权声明:本文为博主原创文章,转载时请务必注明本文地址, 禁止用于任何商业用途, 否则会用法律维权。 https://blog.csdn.net/stpeace/article/details/84037370
先来看个简单的go程序:
[code]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) }
结果:
*main.Task
&{TaskId: X:0 Y:0}
&{TaskId: X:0 Y:0}
再看:
[code]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时,编译器会进行静态检查, 故编译错误。 那怎么办呢? 可以这么搞:
[code]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}
顺便提一句, 在Task中, 变量的首字母要大写, 否则呵呵哒。
还可以这么搞:
[code]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}
不多说。
阅读更多
相关文章推荐
- 编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别
- 动态,静态,强类型,弱类型
- 编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言的区别
- 解释型vs编译型 动态vs静态 强类型vs弱类型
- O-C相关-08-动态类型与静态类型
- 编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言的区别
- 三十一、多态性、动态类型 和 动态绑定(四)id类型 和 静态类型
- 弱类型、强类型、动态类型、静态类型语言的区别是什么?
- 四大类型的语言,动态,静态,强类型,弱类型
- 静态语言和动态语言、强类型和弱类型
- 动态类型语言和静态类型语言
- 关于动态语言和静态语言、强类型定义语言和弱类型定义语言的概念区分
- 弱类型、强类型、动态类型、静态类型语言的区别是什么?
- 静态类型与动态类型
- O-C相关-08-动态类型与静态类型
- 动态语言,静态语言,动态类型语言,静态类型语言,动态编程语言,静态编程语言(未完)
- 解析C++中的虚拟函数及其静态类型和动态类型
- 动态/静态语言及强类型/弱类型语言简析
- C++中静态类型和动态类型
- 动态语言 静态语言 强类型语言 弱类型语言