ビルトインの共通パッケージをGolang

文字列の文字列関数

  • Contains(s, substr string) bool
    S文字列は、文字列SUBSTRが含まれている真を返す含みます
  • Split(s, sep string) []string
    SをSepによるスライスの区切り文字列に分割され
  • Join(a []string, sep string) string
    によってスライスリンク9月以降の文字列の連結、
  • Trim(s string, cutset string) string
    カットセットの文字列は、文字列sの頭と尾を取り除くに指定します
  • Replace(s, old, new string, n int) string
    文字列内のSは、新しい文字列は古い文字列を置き換えるために、N-表す置換の数は0が全置換を表す未満であり、交換が0に等しくありません
  • Repeat(s string, count int) string
    Sは、文字列数回繰り返し、最終的に重複している文字列を返します。
  • Index(s, substr string) int
    検索文字列sところ9月の復帰位置値の場所が見つからないか、または-1することはできません。0の戻りが第一の位置を示すことに注意してください

StrConv文字列変換

関数ファミリを追加

文字列等を整数に変換した後、既存のバイト配列に追加されます。

package main

import (
    "fmt"
    "strconv"
)

func main()  {
    str := make([]byte, 0, 10)
    str = strconv.AppendInt(str, -1, 10)
    str = strconv.AppendUint(str, 1, 10) //无符号
    fmt.Println(string(str))
    str = strconv.AppendFloat(str, 3.14159, 'f', 2, 32)
    fmt.Println(string(str))
    str = strconv.AppendFloat(str, 30.14159, 'e', 3, 64)
    fmt.Println(string(str))
    str = strconv.AppendBool(str, true)
    fmt.Println(string(str))
    str = strconv.AppendQuote(str, "hello")
    fmt.Println(string(str))
    str = strconv.AppendQuoteRune(str, 97) //字符a对应的ascii码
    fmt.Println(string(str))

}

出力:

-11
-113.14
-113.143.014e+01
-113.143.014e+01true
-113.143.014e+01true"hello"
-113.143.014e+01true"hello"'a'

注:
1、strconv.AppendInt(dst []byte, i int64, base int)3番目のパラメータは10進の代わりにここで書かれた16進数です。
2、strconv.AppendFloat(dst []byte, f float64, fmt byte, prec, bitSize int)fmt標識されたフォーマット(B、E、E、F 、G、G)、 prec精度(インデックス部分を含まないデジタル部分の長さ)のために、bitSize指定された浮動型(32:float32,64:のfloat64)。
フォーマットのタグ:

// 'b' (-ddddp±ddd,二进制指数)
// 'e' (-d.dddde±dd,十进制指数)
// 'E' (-d.ddddE±dd,十进制指数)
// 'f' (-ddd.dddd,没有指数)
// 'g' ('e':大指数,'f':其它情况)
// 'G' ('E':大指数,'f':其它情况)

// 如果格式标记为 'e','E'和'f',则 prec 表示小数点后的数字位数
// 如果格式标记为 'g','G',则 prec 表示总的数字位数(整数部分+小数部分)

図3は、strconv.AppendQuote(dst []byte, s string) []byte文字列によって引き起こされる「二重引用符」に文字列sを変換し、その結果が、追加の帰国後、DSTの末尾に追加されます[]byte特殊文字の一つは、エスケープ文字」に変換されます。」

Format関数のシリーズ

他のタイプは、文字列に変換されます。

package main

import (
    "fmt"
    "strconv"
)

func main()  {
    fmt.Println(strconv.FormatBool(true))
    fmt.Println(strconv.FormatInt(1, 10))
    fmt.Println(strconv.FormatUint(1, 10))
    fmt.Println(strconv.FormatFloat(3.14159, 'f', 2, 32))
}

出力:

true
1
1
3.14

解析機能シリーズ

int型のuintブールフロートに文字列は、errは、変換が成功したかどうかを指定します。

package main

import (
    "fmt"
    "strconv"
)

func main()  {
    fmt.Println(strconv.ParseBool("true"))
    fmt.Println(strconv.ParseInt("100", 10, 0))
    fmt.Println(strconv.Atoi("100")) // 通常使用这个函数,而不使用 ParseInt
    fmt.Println(strconv.ParseUint("100", 10, 0))
    fmt.Println(strconv.ParseFloat("3.14159", 32))
}

出力:

true <nil>
100 <nil>
100 <nil>
100 <nil>
3.141590118408203 <nil>

注:
1、strconv.ParseInt(s string, base int, bitSize int)3番目の引数はbitSizeINT8 INT16 INT32 int64モードでビットサイズ、のリターン結果です。0の場合、デフォルト値はstrconv.IntSize、マシンのサイズは64 64です。

引用シリーズの機能

1、strconv.Quote(s string) string文字列sの特殊文字は、「文字を表示することができません」に変換されます「の文字をエスケープ」に変換されますここで「二重引用符は、」原因の文字列は、「文字をエスケープします。」
2は、strconv.QuoteToASCII(s string) string原因に変換され、「非ASCII文字、」と「特殊文字」ASCII文字列に'sの文字列に変換「の文字をエスケープします。」
図3は、strconv.QuoteRune(r rune) stringUnicode文字は、「特殊文字は」に変換され、「単一引用符」で区切られた文字列に変換されている「文字をエスケープします。」

package main

import (
    "fmt"
    "strconv"
)

func main()  {
    fmt.Println(strconv.Quote(`hello go 语言\n`))
    fmt.Println(strconv.Quote("hello go 语言\n"))
    fmt.Println(strconv.QuoteToASCII(`hello go 语言\n`))
    fmt.Println(strconv.QuoteRune(97))
    fmt.Println(strconv.QuoteRuneToASCII(97))
}

出力:

"hello go 语言\\n"
"hello go 语言\n"
"hello go \u8bed\u8a00\\n"
'a'
'a'

エンコーディング

エンコード/ JSON

  • json.Marshal(v interface{}) ([]byte, error) 生成JSON
  • json.Unmarshal(data []byte, v interface{}) error JSONインタフェースを解析するには

JSONの構文解析

package main

import (
    "encoding/json"
    "fmt"
)

type Employee struct {
    FirstName string `json:"firstName"`
    LastName string `json:"lastName"`
}

type EmployeeSlice struct {
    Employees []Employee `json:"employees"`
}

func main()  {
    str := `{"employees":[{"firstName":"Bill","lastName":"Gates"},{"firstName":"George","lastName":"Bush"}]}`
    var res EmployeeSlice
    json.Unmarshal([]byte(str), &res)
    fmt.Println(res)
    fmt.Println(res.Employees[0].FirstName)
}

出力:

[{Bill Gates} {George Bush}]}
Bill

生成JSON:

package main

import (
    "encoding/json"
    "fmt"
)

type Employee struct {
    FirstName string `json:"firstName"`
    LastName string `json:"lastName"`
}

type EmployeeSlice struct {
    Employees []Employee `json:"employees"`
}

func main()  {
    data := EmployeeSlice{[]Employee{
        {FirstName:"Bill", LastName:"Gates"},
        {FirstName:"George", LastName:"Bush"},
    }}
    res,_ := json.Marshal(data)
    fmt.Println(string(res))
}

出力:

{"employees":[{"firstName":"Bill","lastName":"Gates"},{"firstName":"George","lastName":"Bush"}]}

暗号

MD5

package main

import (
    "crypto/md5"
    //"io"
    "fmt"
    "encoding/hex"
)

func main(){
    h := md5.New()
    //io.WriteString(h, "123456")
    h.Write([]byte("123456"))
    cipherStr := h.Sum(nil)
    fmt.Println(cipherStr) //一个128bit的16字节byte数组
    fmt.Println(hex.EncodeToString(cipherStr)) // 输出加密结果 
}

出力を実行します。

[225 10 220 57 73 186 89 171 190 86 224 87 242 15 136 62]
e10adc3949ba59abbe56e057f20f883e

使用して同じ効果を、複数回に一度、文字列の終わりには、前面に追加されます。io.WriteString(h, "123456")h.Write([]byte("123456"))Write

またmd5、そこにあるsha1sha256方法を使用することと似ています。

//import "crypto/sha256"
h := sha256.New()
io.WriteString(h, "123456")
fmt.Printf("%x", h.Sum(nil))

//import "crypto/sha1"
h := sha1.New()
io.WriteString(h, "123456")
fmt.Printf("%x", h.Sum(nil))

BASE64

package main

import (
    "encoding/base64"
    "fmt"
)

// 编码
func base64Encode(str []byte) []byte {
    return []byte(base64.StdEncoding.EncodeToString(str))
}

// 解码
func base64Decode(str []byte) ([]byte, error){
    return base64.StdEncoding.DecodeString(string(str))
}

func main(){
    str := "hello"
    enc_str := base64Encode([]byte(str))
    fmt.Println(enc_str)
    fmt.Println(string(enc_str))

    dec_str,err := base64Decode(enc_str)
    if(err != nil){
        fmt.Println(err.Error())
    }

    fmt.Println(dec_str)
    fmt.Println(string(dec_str))
}

出力:

[97 71 86 115 98 71 56 61]
aGVsbG8=
[104 101 108 108 111]
hello

AES

ネット

ネット/ URL

ネット/ HTTP

net/httpそれは、共通のGET、POSTリクエストのために良いサポートしています。

リクエストを取得

package main

import (
    "net/http"
    "fmt"
    "io/ioutil"
    "io"
)

func main() {
    var url string = "http://httpbin.org/get?page=1&limit=2"
    resp, err := http.Get(url)
    if (err != nil) {
        fmt.Println(err.Error())
    }

    fmt.Println(resp.Status)     //200 ok
    fmt.Println(resp.StatusCode) //200

    var bodyReader io.ReadCloser = resp.Body //返回的是io.Reader
    body, _ := ioutil.ReadAll(bodyReader)
    fmt.Println(string(body))
}

出力:

200 OK
200
{
  "args": {
    "limit": "2", 
    "page": "1"
  }, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Connection": "close", 
    "Host": "httpbin.org", 
    "User-Agent": "Go-http-client/1.1"
  }, 
  "origin": "221.217.54.202", 
  "url": "http://httpbin.org/get?page=1&limit=2"
}

ポストフォーム要求

フォームを使用するための要求を掲示http.PostForm()追加パラメータの必要性に加えて、他のように、要求を取得します。

package main

import (
    "net/http"
    "fmt"
    "io/ioutil"
    "io"
    "net/url"
)

func main() {
    var apiURL string = "http://httpbin.org/post?page=1"
    var params url.Values = url.Values{"names": []string{"yjc", "yjc1"}}
    params.Set("age", "20")
    resp, err := http.PostForm(apiURL, params)
    if (err != nil) {
        fmt.Println(err.Error())
    }

    fmt.Println(resp.Status)     //200 ok
    fmt.Println(resp.StatusCode) //200

    var bodyReader io.ReadCloser = resp.Body //返回的是io.Reader
    body, _ := ioutil.ReadAll(bodyReader)
    fmt.Println(string(body))
}

出力:

200 OK
200
{
  "args": {
    "page": "1"
  }, 
  "data": "", 
  "files": {}, 
  "form": {
    "age": "20", 
    "names": [
      "yjc", 
      "yjc1"
    ]
  }, 
  "headers": {
    "Accept-Encoding": "gzip", 
    "Connection": "close", 
    "Content-Length": "27", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Go-http-client/1.1"
  }, 
  "json": null, 
  "origin": "221.217.54.202", 
  "url": "http://httpbin.org/post?page=1"
}

パッケージ

package tool

import (
    "io/ioutil"
    "net/http"
    "net/url"
    "fmt"
)

// get 网络请求
func Get(apiURL string, params url.Values) (rs []byte, err error) {
    var Url *url.URL
    Url, err = url.Parse(apiURL)
    if err != nil {
        fmt.Printf("解析url错误:\r\n%v", err)
        return nil, err
    }
    //如果参数中有中文参数,这个方法会进行URLEncode
    Url.RawQuery = params.Encode()
    resp, err := http.Get(Url.String())
    if err != nil {
        fmt.Println("err:", err)
        return nil, err
    }
    defer resp.Body.Close()
    return ioutil.ReadAll(resp.Body)
}

// post 网络请求 ,params 是url.Values类型
func Post(apiURL string, params url.Values) (rs []byte, err error) {
    resp, err := http.PostForm(apiURL, params)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    return ioutil.ReadAll(resp.Body)
}

ネット/ HTTP / pprof

パッケージには、パフォーマンス監視コードを実行します。使用例:

package main

import (
    "net/http"
    _ "net/http/pprof"
)

func main(){
    //提供给负载均衡探活以及pprof调试
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("ok"))
    })

    http.ListenAndServe(":10000", nil)
}

実行した後、ブラウザが開き、http://127.0.0.1:10000/debug/pprof/監視情報の一部を見ることができます。上記の本番環境によると、一般的にそう書いていない、一般的にオープンコルーチンのとおりです。

go http.ListenAndServe(":10000", nil)

PProfビジュアルインターフェースを起動する方法?

あなたは必要とするgraphvizために、サポートを環境変数にダウンロードし、ビンをhttp://www.graphviz.org/download/。マックはBREWを使ってインストールすることができます

以下profile、一例として(CPUプロファイル):

この方法の一つ:

go tool pprof -http=:8080 http://localhost:10000/debug/pprof/profile

方法2:

go tool pprof http://localhost:10000/debug/pprof/profile

そして、対話型のコマンドラインでwebデフォルトのブラウザにジャンプします。(マシンのテストが失敗した、崇高なテキストを開きました)

参考:詳細pprof Golang
https://studygolang.com/articles/14519

インクルード

OSのファイル操作の関数のほとんどは、パッケージの内側にあります。

ディレクトリの操作:

  • func Mkdir(name string, perm FileMode) error
    ディレクトリ名の名前を作成し、アクセス権の設定は、0777のようにパーマ、です。
  • func MkdirAll(path string, perm FileMode) error
    パスに従って、マルチレベルのサブディレクトリを作成します。
  • func Remove(name string) error
    ディレクトリ名の名前を削除して、ファイルのディレクトリまたは他のディレクトリがある場合に、間違ったことを。
  • func RemoveAll(path string) error
    パスは、単一の名前、削除されたディレクトリの下に、その後のサブディレクトリである場合は、パスによると、サブディレクトリのレベルを削除します。

例:

package main

import (
    "os"
    "fmt"
)

func main()  {
    os.Mkdir("tmp", 0755)
    os.MkdirAll("tmp/test/test2", 0755)
    err := os.Remove("tmp")
    if err != nil{
        fmt.Println(err)
    }
    os.RemoveAll("tmp")
}

出力を実行します。

remove tmp: The directory is not empty.

ファイル操作:

  • func Create(name string) (file *File, err Error)
    新しいファイルによって提供されたファイル名を作成し、ファイルオブジェクトを返し、デフォルトの権限は0666ファイル、返されたオブジェクトは読み取り - 書き込みです。
  • func NewFile(fd uintptr, name string) *File
    ファイルディスクリプタに基づいて、適切なファイルを作成し、ファイルオブジェクトを返します。

  • func Open(name string) (file *File, err Error)
    このメソッドは、ファイルの名前の名前を開きますが、読み取り専用で、実際には、内部コールの達成
    のOpenFileを。
  • func OpenFile(name string, flag int, perm uint32) (file *File, err Error)
    名としてファイル名を開き、フラグが途中であり、読み取り専用、読み取りおよび書き込み、パーマ権限
  • func (file *File) Write(b []byte) (n int, err Error)
    ファイルへの情報のバイト型を書きます
  • func (file *File) WriteAt(b []byte, off int64) (n int, err Error)
    指定された場所に情報のバイトを書き始めます
  • func (file *File) WriteString(s string) (ret int, err Error)
    情報をファイルに文字列を書きます
  • func (file *File) Read(b []byte) (n int, err Error)
    Bにデータを読みます
  • func (file *File) ReadAt(b []byte, off int64) (n int, err Error)
    bにオフからデータを読み込み
  • func Remove(name string) Error
    あなたはnameという名前のファイルを削除することができ、この関数を呼び出します。ファイルを削除し、削除したフォルダは、同じ機能です。

I / ioutil

いくつかの実用的なパッケージioutil可変外用、方法7の合計を提供するために、I / O機能をカプセル化します。

  • func ReadFile(filename string) ([]byte, error)
    ReadFile関数は、ファイル内のすべてのデータを読み込み、その内容は、発生したエラーを読んで返します。
  • func WriteFile(filename string, data []byte, perm os.FileMode) error
    元のデータと、ファイルが存在しない場合、それは、空になります前にファイルを作成する権限を指定され、ファイルにデータを書き込むWriteFile関数。

  • func ReadDir(dirname string) ([]os.FileInfo, error)
    READDIRは、(サブディレクトリは含まない)指定されたディレクトリ内のすべてのディレクトリとファイルを読み込みます。ファイルや情報のリストが発生したエラーを読んで返し、リストがソートされます。

  • func TempFile(dir, prefix string) (f *os.File, err error)
    一時ファイルは、ディレクトリdirに一時ファイルの接頭辞接頭辞を作成し、読み書きモードで開きます。ファイルオブジェクトを作成し、発生したエラーメッセージを返します。dirは、ファイルを作成した場合(デフォルトの一時ディレクトリに空の参照os.TimeDir、別の一時ファイルを作成するための複数の呼び出し)を、呼び出し側がf.Nameによって、ファイルのフルパスを取得することができます()。この関数を呼び出すことによって作成された一時ファイルは、呼び出し側自身が削除されるべきです。
  • func TempDir(dir, prefix string) (name string, err error)
    TEMPDIR機能は、(一時ファイルなど、および他の機能、)一時ディレクトリを作成することで、完全なディレクトリが作成され、発生したエラーメッセージが返されました。

  • func ReadAll(r io.Reader) ([]byte, error)
    ファイルを読むためにすべてのデータのReadFile、データが読み込まれ、発生したエラーを返しています。読み取りが成功した場合は、代わりにEOFを、nilを返します誤ります。このメソッドは、有効io.Readerインタフェースを使用します。

  • func NopCloser(r io.Reader) io.ReadCloser
    NopCloserはReadCloserのRタイプとしてパッケージ化されますが、Closeメソッドは何もしません。

IOパッケージは、基本的なプリミティブIOインタフェース(I / Oプリミティブ)を提供することです。

IOパッケージのgolang -劉さんパーソナルスペースへ-オープンソース中国
https://my.oschina.net/liudiwu/blog/305023

コマンドライン引数を取得するために使用します。

例:

package main

import (
    "flag"
    "fmt"
)

func main() {
    backup_dir := flag.String("b", "/home/default_dir", "backup path")
    debug_mode := flag.Bool("d", false, "debug mode")

    flag.Parse()

    fmt.Println("backup_dir: ", *backup_dir)
    fmt.Println("debug_mode: ", *debug_mode)
}

flag.Stringのgolang -ブログパーク- hezhixiong
http://www.cnblogs.com/hezhixiong/p/4659477.html

同期

sync.WaitGroup

package main

import (
    "fmt"
    "time"
)

func main(){
    for i := 0; i < 100 ; i++{
        go fmt.Println(i)
    }
    time.Sleep(time.Second)
}

待つメインスレッド上でgoroutine実行が完了すると、プログラムが使用を終了しなければならなかったtime.Sleep()完全に動作する他のスレッドを待って、いくつかの時間をスリープ状態に。しかし、時間のほとんどは、我々は予測することはできないfor内部ループコード実行している時間の長さを。あなたはこの時間を使用することはできませんtime.Sleep()操作の完了を待ちます。

この場合は、他のツールは、言語に行くsync.WaitGroup私たちはこの目標を達成するのを助けるために、より便利にすることができます。WaitGroup内部オブジェクトは、最初の三つの方法を有する0から出発して、カウンタを有している:Add()Done()Wait()カウンターの数を制御するために使用されます。Add(n)カウンタに設定されnDone()各タイムカウンタ-1wait()カウンタ値が減少するまで実行されるコードからブロックされます0

上記のコードを使用してWaitGroupをに変更することができます。

func main() {
    wg := sync.WaitGroup{}
    wg.Add(100)
    for i := 0; i < 100; i++ {
        go func(i int) {
            fmt.Println(i)
            wg.Done()
        }(i)
    }
    wg.Wait()
}

参照:Golang sync.WaitGroupの使用
https://studygolang.com/articles/12972?fr=sidebar

ランタイム

ランタイム/デバッグ

以下の場合:

  • 必須のガベージコレクション
  • ガベージコレクションの対象割合を設定
  • 最大メモリを設定すると、単一のgoコルーチンのコールスタックを使用することができますです
  • 最大オペレーティングシステムのセットアッププログラムは、スレッドの数を行くことができます
  • 実行セットアッププログラムの要求をのみ、パニックを引き起こしたが、崩壊していません
  • 情報の廃棄物の統計情報収集を書きます
  • オブジェクトがファイルに書き込まれているヒープメモリの割り当てと説明します
  • コルーチン呼び出しスタックトレースを行くゲット
  • 標準エラー出力にスタックトレース

详见:行くランタイム/デバッグ
https://www.jianshu.com/p/0b3d11f7af57

おすすめ

転載: www.cnblogs.com/52fhy/p/11295090.html