我想知道在golang中做这样的事情是否可行 -
type MyStruct struct {
id int
}
func (ms *MyStruct) PrintHello() {
fmt.Printf("Hello from original method %v", ms.id)
}
func main() {
fmt.Println("Hello, playground")
m := MyStruct{}
m.PrintHello()
m.PrintHello = func() {fmt.Printf("Hello from newer method 2")}
}
Error: cannot assign to m.PrintHello
Run Code Online (Sandbox Code Playgroud)
https://play.golang.org/p/2oJQFFH4O5
很抱歉,如果这对Go程序员没有意义,我是Go的新手,想知道是否可以在Go中完成动态类型语言中可以完成的一些事情.谢谢!:-)
鉴于Go是一种静态类型语言,您无法执行此特定代码.但是,函数是变量,所以你可以做这样的事情.请记住,这在技术上与分配新方法不同,正如JimB在评论中所述.
https://play.golang.org/p/rfuCzXD8fP
package main
import (
"fmt"
)
type MyStruct struct {
id int
PrintHello func(ms * MyStruct)
}
func (ms *MyStruct) init() {
ms.PrintHello = func(ms *MyStruct) { fmt.Printf("Hello from original method %v\n", ms.id) }
}
func main() {
m := &MyStruct{id: 42}
m.init()
m.PrintHello(m)
m.PrintHello = func(ms *MyStruct) { fmt.Printf("Hello from newer method 2 %d\n", ms.id) }
m.PrintHello(m)
}
Run Code Online (Sandbox Code Playgroud)
因为此函数实际上不是一个方法,所以只能通过将其作为参数传递来访问内部struct值.这意味着如果必须跨越包边界,则未导出的值将不可用.
同样重要的是要注意功能类型必须相同.因此,如果您PrintHello func(ms * MyStruct) error在结构中定义函数,则需要分配一个返回错误的函数.