14

在 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),因为 point 的类型声明没有被导出。

4

4 回答 4

20

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

因此,如果您NewGeometryPoint定义了一个 func ,那么您也许可以这样做(尚未针对编译器进行测试)

p := NewGeometryPoint(640,480);
fmt.Println("X:",p.X, "Y:",p.Y);
于 2009-11-20T21:17:50.800 回答
10

抽象基类型?

package geometry

type point struct {
    X, Y int;
}

type Point struct {
    point;
    name string;
}

type Rect struct {
    P1, P2 point;
    name string;
}
于 2009-11-20T22:04:18.927 回答
5

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

于 2011-02-16T21:49:14.570 回答
2

这个 Go 课程中提出了同样的问题:

[...]您甚至可能有一个带有导出字段的私有类型。练习:什么时候有用?

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


// 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
}

// main.go

package main

import (
    "fmt"

    "./geometry"
)

func main() {
    vector := geometry.Vector{}
    vector.Start.X = 10
    vector.Start.Y = 10
    vector.End.X = 10
    vector.End.Y = 10

    fmt.Printf("Vector: %#v\n", vector)
}

结果 -> 向量:geometry.Vector{Start:geometry.point{X:10, Y:10}, End:geometry.point{X:10, Y:10}}


因此,在我看来,这种机制旨在让您在声明内部数据结构时具有灵活性。

于 2020-01-25T19:32:23.590 回答