2016-05-17 5 views
1

私は経験豊富なプログラマーですが、新しいことはありませんので、私が確信していることを前もってお詫びするのは簡単な質問です。Go Base64パッケージの "StdEncoding"とは何ですか?

goland.orgサイトのbase64 example codeには、次のコードが含まれています。

package main 

import (
    "encoding/base64" 
    "fmt" 
) 

func main() { 
    msg := "Hello, 世界" 
    encoded := base64.StdEncoding.EncodeToString([]byte(msg)) 
    fmt.Println(encoded) 
    decoded, err := base64.StdEncoding.DecodeString(encoded) 
    if err != nil { 
     fmt.Println("decode error:", err) 
     return 
    } 
    fmt.Println(string(decoded)) 
} 
私はコピーして、問題なくこのコードを使用しますが、新しい行くプログラマーとして、私は理解していないことができ

次の行のStdEncoding部分は、私が理解し

decoded, err := base64.StdEncoding.DecodeString(encoded) 

こと上記のプログラムはencode/base64関数を私のプログラムにインポートします。しかし、私look at the documentationあれば、base64でパッケージには、私はStdEncodingの種類を見ることが期待される次の種類や機能

func NewDecoder(enc *Encoding, r io.Reader) io.Reader 
func NewEncoder(enc *Encoding, w io.Writer) io.WriteCloser 
type CorruptInputError 
    func (e CorruptInputError) Error() string 
type Encoding 
    func NewEncoding(encoder string) *Encoding 
    func (enc *Encoding) Decode(dst, src []byte) (n int, err error) 
    func (enc *Encoding) DecodeString(s string) ([]byte, error) 
    func (enc *Encoding) DecodedLen(n int) int 
    func (enc *Encoding) Encode(dst, src []byte) 
    func (enc *Encoding) EncodeToString(src []byte) string 
    func (enc *Encoding) EncodedLen(n int) int 
    func (enc Encoding) WithPadding(padding rune) *Encoding 

で構成されています - しかし、私はこのリストにStdEncodingの一切の言及が表示されません。

私の直接の質問は - StdEncodingとは何ですか?

私のより高いレベルの質問はおそらく、正確には、モジュールのユーザーが消費するためにモジュールからエクスポートされたもので、goユーザーとしてそれらのエクスポートされたものをブラウズできます。

上記のモジュール、エクスポート、インポートのような用語の誤った使用を修正してgo文脈に入れることができれば、ボーナスポイントです。

答えて

2

あなたの質問すべてを一度に試してみる...ここに含まれているファイルbase64.goにStdEncodingの定義があります。

65 // StdEncoding is the standard base64 encoding, as defined in 
66 // RFC 4648. 
67 var StdEncoding = NewEncoding(encodeStd) 

以降、constはそのように定義されています。定義されているよう

33 const encodeStd = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/" 

は、だからあなたのメインの質問に答えるために、それはタイプが*Encodingであり、あなたがしたい場合は、あなたも同じ場所にNewEncodingの実装を表示することができRFC 4648.にちょうどbase64でエンコーディングです。 https://golang.org/src/encoding/base64/base64.go

パッケージ/モジュールとエクスポートに関する補足的な質問に答えるには... goドキュメントでは、エクスポートされたすべてのものとエクスポートされていないものは表示されません(実際のソースを見ると、非公開のヘルパーメソッドの良い取引を見つける)。あなたがソースを見ているなら、メソッド/タイプ/コンストラクトの名前でこの区別を見ることができます。基本的な規則は、識別子が大文字で始まり、それがエクスポートされ、それが小文字であればエクスポートされないということです。

もう一つ言いたいことは、言語がオープンソースであるということです。ドキュメントでは、パッケージのメインファイル(おそらく他のものも)を一覧表示するので、開くことができます。あなたはコードがよくコメントされており、通常はかなり理解しやすいことがわかります。多くの場合、これらのファイルのコメントを読むだけで、内部的にどのように動作するかについての質問に対する回答を見つけることができます。

+0

ありがとうございます - タイプと関数だけがエクスポートされたという(誤った)仮定がありました。私は普通の古い変数も同様であるとは思いませんでした!それは今より多くの意味があります。 –

関連する問題