Go语言的静态类型和动态类型示例

先来看个简单的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)
}

结果:

*main.Task
&{TaskId: X:0 Y:0}
&{TaskId: X:0 Y:0}

再看:

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}

你可能感兴趣的:(Golang)