文字列の文字列関数
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番目の引数はbitSize
INT8 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) string
Unicode文字は、「特殊文字は」に変換され、「単一引用符」で区切られた文字列に変換されている「文字をエスケープします。」
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)
生成JSONjson.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
、そこにあるsha1
、sha256
方法を使用することと似ています。
//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)
カウンタに設定されn
、Done()
各タイムカウンタ-1
、wait()
カウンタ値が減少するまで実行されるコードからブロックされます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