2016-12-22 5 views
0

可能なオプションのセットのみを許可するデータ構造とは何ですか?セットの1つだけを許可するデータ構造ですか? Golang

私はenumと一緒に遊んでみましたが、私は欲しいものではありません。

package main 

import "fmt" 

type Event struct { 
     day_number Day 
} 

type Day int 

const (
     Monday Day = iota 
     Tuesday 
     Wednesday 
     Thursday 
     Friday 
     Saturday 
     Sunday 
) 

func main() { 
     var r Event 
     r.day_number = Monday 
     fmt.Println(r.day_number) 
     // Keep this from happening. 
     var impossible Event 
     impossible.day_number = 12 
     fmt.Println(impossible.day_number) 
} 

答えて

1

別のパッケージを使用してメンバーフィールドを非表示にすることができます。これにより、そのパッケージから構造体を関数に作成する方法が制限され、制限された入力セットを受け入れるようにこれらの関数を制御することができます。

foo/foo.go

package foo 

import "fmt" 

type entity int 

const (
    one entity = iota + 1 
    two 
) 

type Foo struct { 
    e entity 
} 

func (f Foo) Get() int { 
    return int(f.e) 
} 

func NewFoo(i int) Foo { 
    switch i { 
    case 1: 
     return Foo{one} 
    case 2: 
     return Foo{two} 
    default: 
     panic(fmt.Errorf("%s", "foo")) 
    } 
} 

bar.go

package main 

import "fmt" 
import "./foo" 

func main() { 
    f := foo.NewFoo(2) 
    fmt.Println(f.Get()) 
    e := foo.Foo{3} // Error: implicit assignment of unexported field 'e' in foo.Foo literal 
    fmt.Println(e.Get()) 
    d := foo.NewFoo(3) // panic: foo! 
    fmt.Println(d.Get()) 
} 

あなたはfooパッケージの外Foo構造体を作成することはできません、とfooパッケージにFoo構造体を作成する唯一の機能は限られを受け入れます値の集合。

0

あなたのday_numberフィールドがパッケージ外に既にアクセスできないので、これは意味があるかどうかはわかりません。

func (d Day) String() string { 
    if v, ok := map[Day]string{ 
     Monday: "Monday", 
     Tuesday: "Tuesday", 
     Wednesday: "Wednesday", 
     Thursday: "Thursday", 
     Friday: "Friday", 
     Saturday: "Saturday", 
     Sunday: "Sunday", 
    }[d]; ok { 
     return v 
    } 
    return "Bad day" 
} 

func (e *Event) SetDay(d Day) error { 
    if v := d.String(); v == "Bad day" { 
     return fmt.Errorf(v) 
    } 
    e.day_number = d 
    return nil 
} 

Playground link

:これは本当に必要かどう

それでも、あなたは、以下SetDay方法として、入力を検証する方法を経由してプライベートフィールドを設定したいです

関連する問題