控制未导出的结构字段

时间:2020-08-17 23:45:12

标签: go

所以这是我在stackoverflow中的第一个问题。 :)

我们在org包中定义了一个结构,如下所示:

type Employee struct {
    FirstName, LastName string
    salary              int
}

然后在main.go文件中,我们初始化如下的结构:

func main() {
    ross := Employee {
       FirstName: "Ross",
       LastName:  "Geller",
    }

    fmt.Println(ross)
}

输出如下:

{Ross Geller 0}

由于薪水字段不是从Employee结构类型导出的,因此它显示int的零值。最终用户将假定此员工的薪水为0。

  1. 那么有什么方法可以控制未导出的字段?
  2. 在实时情况下解决此类问题的最佳方法是什么?
  3. 这真的有问题吗?

2 个答案:

答案 0 :(得分:1)

如果您真的很担心,可以覆盖Employee的std::map<std::string,int> mymap; mymap["playerhealth"]=20; while(1) { //... if(...) break; } std::string string; std::cout<<"Enter command: "; std::cin>>string; std::string vartobechanged=string.substr(0,string.find("=")); mymap[vartobechanged]=atoi(string.substr(string.find("=")+1,string.length()-string.find("=")-1).c_str());

https://play.golang.org/p/PncEOGVP2HP

.String

但是实际上,他们会在程序控制台中看到输出吗?这很可能是非问题。

答案 1 :(得分:0)

好吧,如果要初始化字段,则可以始终编写导出的函数或方法来实现,例如

func New(first,last,salary string) Employee{
  //...
}

之所以可以具有未导出的类型,是为了能够创建称为不透明类型的东西。

您可以在数据设置器和获取器上使用方法,并执行复杂的操作,而不必担心用户会破坏数据的内部状态。

想象一下,您正在编写绘图应用程序,并且有一个画家Struct,它可以跟踪光标以及当前的颜色和内容。您确实不希望您的用户能够手动与您的画家打交道。那会破坏一切。

因此,用户通过初始化程序创建了painter,并将其作为Painter类型传递,并使用moveTolineTo之类的方法在内部更新状态。

相关问题