具有导出字段的私有类型

时间:2009-11-20 20:56:29

标签: go

在go教程的第2天有这个练习:

为什么拥有导出字段的私有类型会有用呢?

例如:

package geometry

type point struct {
    X, Y int;
    name string;
}

请注意point是小写的,因此不会导出,而字段X和Y是大写的,因此是。在我看来,为了能够访问其中一个导出的字段,您必须能够编写类似的内容。

p.X

但是为了使这成为可能,p必须有这样的声明:

var p geomitry.point;

p := new(geomitry.point);

然而这是不可能的(afaik),因为不会导出点的类型声明。

4 个答案:

答案 0 :(得分:20)

但你可以拥有一个公共构造函数,对吧?

因此,如果您定义了NewGeometryPoint func,那么您可能会这样做(未针对编译器进行测试)

p := NewGeometryPoint(640,480);
fmt.Println("X:",p.X, "Y:",p.Y);

答案 1 :(得分:9)

抽象基类型?

package geometry

type point struct {
    X, Y int;
}

type Point struct {
    point;
    name string;
}

type Rect struct {
    P1, P2 point;
    name string;
}

答案 2 :(得分:5)

使用JSON包时(http://golang.org/pkg/json/)。您需要具有导出的字段,以将类型传递给j​​son.Marshal(),但您可能不希望将该类型公开提供给其他外部包。

答案 3 :(得分:2)

同一问题在in this Go course中显示为:

[...]您甚至可能拥有带有导出字段的私有类型。行使: 什么时候有用?

here所示,您可以从外部访问定义为包内部的元素,而不能直接访问它。对于示例中的“点”结构,这意味着您不能直接访问点的元素,如


AttributeError: module 'pandas._libs.sparse' has no attribute 'sparse_sub_float32'

// geometry.go

package geometry

type point struct {
    X, Y int
}

但是您可以使用定义的点来导出使用其导出的内部元素的元素,如


// main.go

package main

import (
    "fmt"    
    "./geometry"
)

func main() {
    point := geometry.point{
        X: 10,
        Y: 20
    }

    fmt.Printf("Point: %#v\n", point)
}

// geometry.go

package geometry

type point struct {
    X, Y int
}

//Vector ...
type Vector struct {
    Start point
    End   point
}

结果->向量:geometry.Vector {开始:geometry.point {X:10,Y:10},结束:geometry.point {X:10,Y:10}}


因此,我认为,该机制旨在使您灵活地声明内部数据结构。