Golang工厂方法实现遇阻:简单示例无法运行求解答
搞定Go结构体构造的小问题
嗨,我完全懂你这种从OO转Go的困惑——刚接触的时候总忍不住想用旧习惯套新语法,咱们来一步步解决你的问题:
问题出在哪?
你把NewField定义成了datafield的值接收者方法,这意味着这个方法必须绑定到一个已经存在的datafield实例才能调用,但你现在直接用datafield.NewField(用类型名去调用),这在Go里是不允许的——值方法需要具体的实例作为载体,而不是类型本身。
正确的Go式构造方式
Go没有类级别的构造方法,社区里的惯用做法是写一个包级别的函数来处理结构体的初始化,命名一般是New[结构体名](首字母大写让它能被其他包访问,如果你只在当前包用也可以小写)。
修正后的代码如下:
package main import ( "fmt" ) type datafield struct { name string value string } // 包级构造函数,直接返回初始化好的datafield指针 func NewDatafield(name, value string) *datafield { // 用结构体字面量初始化比new()更简洁直观 return &datafield{ name: name, value: value, } } func main() { field := NewDatafield("name", "value") if field == nil { fmt.Println("Error...") } else { fmt.Printf("成功初始化字段:%+v\n", field) } }
额外说明
如果你想更简洁,甚至可以直接在代码里用结构体字面量初始化,不需要单独写构造函数:
field := &datafield{name: "name", value: "value"}
至于你原来写的方法形式,其实并不适合做构造逻辑——如果非要写成方法(不推荐),需要改成指针接收者,但调用前还是得先创建一个实例,完全多此一举:
// 仅作演示,实际开发别这么写 func (d *datafield) Init(name, value string) *datafield { d.name = name d.value = value return d } // 调用时得先new一个实例 field := new(datafield).Init("name", "value")
慢慢习惯Go的风格就好啦,它的类型系统虽然和OO不同,但灵活性一点不差~
内容的提问来源于stack exchange,提问作者SCote
相关产品推荐
相关产品推荐

