Go 将方法与返回“0”的结构相关联;“自我”;

Go 将方法与返回“0”的结构相关联;“自我”;,go,Go,我知道Go没有传统的OOP概念。然而,我很想知道是否有更好的方法来设计“构造函数”,正如我在下面的代码片段中所做的那样: type myOwnRouter struct { } func (mor *myOwnRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello from my own Router!") } func newMyOwnRouter() *myOwnRoute

我知道Go没有传统的OOP概念。然而,我很想知道是否有更好的方法来设计“构造函数”,正如我在下面的代码片段中所做的那样:

type myOwnRouter struct {
}

func (mor *myOwnRouter) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello from my own Router!")
}

func newMyOwnRouter() *myOwnRouter {
    return &myOwnRouter{}
}

func init() {
    http.Handle("/", newMyOwnRouter())
    ...
}
我基本上希望摆脱“独立”newMyOwnRouter()函数,并将其作为结构本身的一部分,例如,我希望能够执行以下操作:

http.Handle("/", myOwnRouter.Router)

这可行吗?

事实上,标准模式是一个新函数

package matrix
function NewMatrix(rows, cols int) *matrix {
    m := new(matrix)
    m.rows = rows
    m.cols = cols
    m.elems = make([]float, rows*cols)
    return m
}
当然,构造函数必须是公共函数,才能在包外部调用

更多关于构造函数模式的信息

在您的情况下,看起来您想要一个Sigleton软件包,那么以下是模式:

package singleton

type myOwnRouter struct {
}

var instantiated *myOwnRouter = nil

func NewMyOwnRouter() * myOwnRouter {
    if instantiated == nil {
        instantiated = new(myOwnRouter);
    }

    return instantiated;
}

所以这总是在包级别上,对吗?然后就是matrix.NewMatrix(…)。在结构级别上没有类似的方法,对吗?不,这是go中的“构造函数”,核心包使用相同的模式:谢谢。非常感谢。最后一个问题:在链接到的源中,它们返回指针(return&Cmd)。如果我接受您粘贴的代码,我是否必须返回&m并返回&实例化?或者您在这里编写的方式正确吗?实例化已经是一个指针,在您的代码中,您正在创建一个实例并返回他的指针。是的,没错
m:=matrix{}
表示法返回一个值而不是指针,因此需要
返回&m
m:=new(matrix)
创建一个指向矩阵的指针,因此只需
返回m
。直接引用golang文档:“表达式
new(File)
&File{}
是等效的。”