page contents

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

先来看个简单的go程序: package main import ( "fmt" ) type TaskIntf interface { Process() } type Task struct { TaskId string X int Y int } func (p *Task)Process()...

attachments-2021-07-4APdDhPK60e3fe5f81864.png

先来看个简单的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技术交流群一起交流学习哦。

attachments-2022-06-7EvYOwYy62ad33842ef19.jpeg

  • 发表于 2021-07-06 14:56
  • 阅读 ( 476 )
  • 分类:Golang

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1474 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章