2016-05-17 66 views
1

我是一位經驗豐富的程序員,但是新的去,所以提前道歉我肯定是一個簡單的問題。Go Base64 Package中的「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)) 
} 

我可以複製並使用此代碼沒有問題,但作爲一個新的go程序員,我不明白什麼以下行的StdEncoding一部分確實

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

我明白上述程序將encode/base64函數導入到我的程序中。不過,如果我look at the documentation,以base64包包括以下類型和功能

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提及任何在此列表中。

所以,我的直接問題是 - 什麼是StdEncoding

我的更高級別的問題可能是 - 模塊的某個用戶正在從模塊中導出哪些內容,以及如何作爲外出用戶瀏覽這些導出的內容。

獎勵分數,如果你可以糾正任何不知情的錯誤使用條款,如模塊,導出,導入上面,並把它們放到一個上下文中。

回答

2

要一次嘗試並回答所有問題......您可以在文件base64.go中找到StdEncoding的定義;

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

和最多在線路33常量被定義爲這樣的;

33 const encodeStd = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/" 

因此,要回答你的主要問題,它只是base64編碼如RFC 4648.定義的類型爲*Encoding,你甚至可以查看NewEncoding實施在相同的位置,如果你願意的話。 https://golang.org/src/encoding/base64/base64.go

要解決一些關於軟件包/模塊和導出的一些輔助問題......在go doc文檔中,您將看到所有導出的內容以及沒有導出的內容(如果您查看實際的源代碼,找到很多未提及的輔助方法)。如果你在查看源代碼,你可以在方法/類型/常量名稱中看到這種區別。基本規則是,如果標識符以大寫字母開頭,那麼它將被導出,如果它較低,則不導出。

另一件值得指出的事情是,該語言是開源的。在文檔中,它通常會列出軟件包主文件(可能還有其他文件),以便您可以打開它並查看。你會發現代碼很好評,通常很容易理解。很多時候,只要閱讀這些文件中的註釋,就可以找到關於內部工作方式的問題的答案。

+0

謝謝 - 我有一個(不正確)的假設,只有類型和函數被導出 - 我沒有意識到簡單的舊變量也是如此!這使現在更有意義。 –