2016-10-20 16 views
0

いくつかのコード私はプログラムやサービスを管理するためのフラグを使用しています。それは私がstringに変換することはできませんどのような*string型変数を戻らあるGolang値にポインタ文字列

var port = flag.String("port", "", "port") 

:今日私は、宣言のこの種を使用していた問題を、得ました。

r.Run(":" + *port) 

それが動作しているが、そのためのベストプラクティスは何です:私はこの問題をどのように管理さ ?私はパラメータとして文字列を待っている関数の負荷があることを意味し、この場合私はそれを処理することはできません。

+0

'flag'パッケージ関数によって返されるものは、「裏の場面」で修正する必要があるため、ポインタです。あなたはおそらく 'flag.Int'を使うほうが良いでしょう。誰かがあなたのプログラムを" -flag crashy "で呼び出すことができるようになっているので、おそらくパニックが起こります。 – Vatine

+1

さて、 'flag.StringVar'を使用してください。時には、パッケージのドキュメントを読むことが本当に役に立ちます。 – Volker

答えて

4

port変数のタイプは*stringです(これはflag.String()が返すものです)。 stringの値を取得するには、逆参照する以外の方法はありません:*port

あなたはstringとしてそれを渡す必要があり、すべての場所でそれを行うこと、またはあなたの代わりにflag.StringVar()使用することができます。この場合

var port string 

func init() { 
    flag.StringVar(&port, "port", "", "port") 
} 

を、あなたのport変数の型stringでれないので、逆参照します必要です。ここでは、使用するflagパッケージに*stringの値を明示的に指定します。タイプstringの変数のアドレスは、もちろんタイプ*stringとなります(したがって、flagパッケージは、指し示された値を変更/設定できるようになります)。 flag.String()は、stringという値を割り当て、それにポインタを戻す便利な関数です。

別のオプションは、一度それを間接参照することがあり、例えば、タイプstringの別の変数にstring値を格納します:

var portp = flag.String("port", "", "port") 
var port string 

func main() { 
    flag.Parse() 
    port = *portp 
    // Now you can use port which is of type string 
} 

しかし、私はflag.StringVar()ソリューションを好みます。

var port int 

func init() { 
    flag.IntVar(&port, "port", 0, "port") 
} 
0

あなたはそれを文字列に変換するだけであるかのようにそれを使用することができるはずです。しかし、ポート番号である、あなたはflag.Int()flag.IntVar()を使用したほうが良いかもしれ

注意。

package main 

import "fmt" 
import "flag" 

func main() { 

    var port = flag.String("port", "", "port") 
    flag.Parse() 

    test(*port) 

    newstring := *port 

    test(newstring) 
} 

func test (s string) { 

    fmt.Println(s) 

}