您的位置:首页 > 编程语言 > Go语言

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}

 

        不多说。

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: