14

goチュートリアルの2日目には、次の演習があります。

エクスポートされたフィールドを持つプライベートタイプがあると便利なのはなぜですか?

例えば:

package geometry

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

pointは小文字であるためエクスポートされないのに対し、フィールドXとYは大文字であるためエクスポートされることに注意してください。エクスポートされたフィールドの1つにアクセスするには、次のようなものを記述できる必要があるように思われます。

p.X

しかし、それを可能にするためには、pは次のような宣言を持っている必要があります。

var p geomitry.point;

また

p := new(geomitry.point);

ただし、pointの型宣言はエクスポートされないため、これは不可能です(afaik)。

4

4 に答える 4

20

しかし、パブリック コンストラクターを使用できますよね?

したがって、NewGeometryPointfunc が定義されている場合は、おそらく実行できます (コンパイラに対してテストしていません)。

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 コースで次のように提示されます。

[...]エクスポートされたフィールドを持つプライベート タイプを使用することもできます。演習: それはいつ役に立つの?

ここに示すように、パッケージの内部として定義された要素に外部からアクセスできますが、直接アクセスすることはできません。例の構造「ポイント」の場合、次のようにポイントの要素に直接アクセスできないことを意味します


// 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 に答える