6

私のGoプログラムには、プログラムの実行中は一定にしたいが、展開サイトで変更できるようにしたい構成値があります。私が知る限り、キーワードを使用してこれを達成する方法はありません。これはconst、(繰り返しますが、私が知る限り)その値はコンパイル時に指定された定数でなければならないためです。これは、私が望むものを達成する唯一の方法は、通常の変数を宣言し、パッケージのinit機能中にそれらを初期化することであることを意味します。それがうまくいかないということではなく、これらの疑似定数の値が変化するのを妨げるものは何もなくなるということです。

私の2つの質問は次のとおりです。

  1. 仕組みについて何か不足していますconstか?
  2. 私がそうではないと仮定すると、これを処理するための好ましい方法は何ですか? 決して公開せず、決して変更しないプライベート変数を返すパブリック関数? 変数は実際には構成設定であるため、人々が変数を変更しないことを望んでいますか?
4

6 に答える 6

5

ファイル「config.go」を作成し、公開する変数を作成します。

それらをエクスポートしないでください (すべて小文字にします)。func代わりに、各アイテムへのアクセスを許可する public (大文字) を作成します。

package config

var x = 10

func X() int {
   return x
}

これらの変数が必要な場合はimport ./config、次のようにコードで使用するだけです。

if config.X()

もちろん、パッケージ内の変数を設定できますinit

于 2013-02-19T13:45:04.217 に答える
1

次のコードは、@ Christopherの2番目のメソッドとほとんど同じですが、モジュールではなく、メインパッケージにあります。

package main

import (
    "os"
)

type Config struct {
    debug                bool
    key                  string
    proxyNumber          int
}

func (c *Config) Debug() bool {
    return c.debug
}
func (c *Config) Key() string {
    return c.key
}
func (c *Config) ProxyNumber() int {
    return c.proxyNumber
}

const (
    CONFIG_NAME = "config.ini"
)

var config *Config

func init() {
    DefaultConfig()
    if Exists(CONFIG_NAME) {
        //try to save the config file
    }else {
        //try to load from the config file

    }
}

func DefaultConfig() {
    config = &Config{debug:true, key:"abcde",
        proxyNumber:5,
    }
}

//Exist: check the file exist
func Exists(path string) bool {
    _, err := os.Stat(path)
    if err == nil { return true }
    if os.IsNotExist(err) { return false }
    return false
}

configを使用して、構成ファイルをロードおよび保存できます。

于 2013-02-16T02:07:02.283 に答える
1

これは非常に良い質問です。なぜなら、Go からの脱落である可能性があると思われるもの、つまり不変状態を掘り下げているからです。

言語リファレンスから、「定数式には定数オペランドのみを含めることができ、コンパイル時に評価されます。」

vars を定数にすることはできません。これは残念です。ジョーの答えは、カプセル化を解決策として提案していますが、これはうまく機能しますが、冗長で退屈で、エラーが発生する可能性があります。

比較すると、多くの不純な関数型言語は、可変変数を単一代入の不変値と組み合わせます。たとえば、Scala にはキーワード「val」と「var」があります。Scala の「var」の意味は、Go の「var」と非常に似ています。不変性は、ツールボックスの便利なツールです。これは、参照透過で副作用のない関数を、ステートフルな可変手続き型コードと共に記述できるためです。どちらにもそれぞれの場所があります。不変性は、ゴルーチン間で不変値が共有されている場合に競合状態が発生する心配がないため、同時実行の貴重なツールでもあります。

私の意見では、Go の多くの長所の中でも、これは Go の欠点の 1 つです。おそらく、var と同様に val をサポートすることは難しくありません。違いは、各 val が 1 回だけ割り当てられていることをコンパイラがチェックすることです。

その機能が追加されるまでは、カプセル化が唯一のオプションです。

于 2013-02-16T16:54:04.197 に答える
0

次のようなことができます。

package main

import (
    "fmt"
    "strconv"
)

var a string

func main() {
    myvar, err := strconv.Atoi(a)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(myvar)
}

プログラムをコンパイルします

go build -ldflags '-X main.a 10' test.go

そうすれば、コンパイル時に定数を定義できます。

于 2013-02-16T17:42:56.413 に答える
0

iniflagsで標準のgo フラグを使用するだけです。標準の go フラグを使用すると、コマンドライン フラグを渡すことで、プログラムの開始時に任意の構成変数を設定できます。一方、iniflags は、ini ファイルから構成変数を読み取るためのサポートを「魔法のように」追加します。

于 2014-08-15T09:58:54.340 に答える