1、fmt格式化輸出等
Println 輸出 Printf 格式化輸出
Scanln 獲取參數(傳參,類似python的input) 如: var name string fmt.Scanln(&name) fmt.Println(name) //結果就是輸入的值 Scanf 接受參數(也是類似python的input作用) 例子: package main import "fmt" func main(){ var name string fmt.Println("name:") fmt.Scanf("%s",&name) fmt.Println(name) } 結果: 輸入值 輸入值 通用: %v 值的默認格式表示 %+v 類似%v,但輸出結構體時會添加字段名 %#v 值的Go語法表示 %T 值的類型的Go語法表示 %% 百分號 布爾值: %t true或false 整數: %b 表示為二進制 %c 該值對應的unicode碼值 %d 表示為十進制 %o 表示為八進制 %q 該值對應的單引號括起來的go語法字符字面值,必要時會采用安全的轉義表示 %x 表示為十六進制,使用a-f %X 表示為十六進制,使用A-F %U 表示為Unicode格式:U+1234,等價於"U+%04X" 浮點數與復數: %b 無小數部分、二進制指數的科學計數法,如-123456p-78;參見strconv.FormatFloat %e 科學計數法,如-1234.456e+78 %E 科學計數法,如-1234.456E+78 %f 有小數部分但無指數部分,如123.456 %F 等價於%f %g 根據實際情況采用%e或%f格式(以獲得更簡潔、准確的輸出) %G 根據實際情況采用%E或%F格式(以獲得更簡潔、准確的輸出) 字符串和[]byte: %s 直接輸出字符串或者[]byte %q 該值對應的雙引號括起來的go語法字符串字面值,必要時會采用安全的轉義表示 %x 每個字節用兩字符十六進制數表示(使用a-f) %X 每個字節用兩字符十六進制數表示(使用A-F) 指針: %p 表示為十六進制,並加上前導的0x
2、strings 字符串模塊
1、Index 輸出第一個字符(從左到右)的序號 如:strings.Index("suoning", "n") 結果:3 2、LastIndex 輸出最后一個(和上面相反) 如:strings.LastIndex("suoning", "n") 結果:5 3、Replace 替換 大於0的數表示替換幾個,0不替換,小於0替換所有 如:strings.Replace("suoning", "n", "#",-1 ) 結果:suo#i#g 4、HasPrefix 類似python的startswith,判斷以什么開頭,返回true和false ,如:strings.HasPrefix("suoning", "suo") 結果:true 5、HasSuffix 判斷以什么結尾,類似python的endswith 如:strings.HasSuffix("suoning", "ning") 結果:true 6、Contains 判斷字符串s是否包含子串s1 如:strings.Contains("suoning", "suoni") 結果:true 7、Count 出現的次數(計數) 如:strings.Count("nnnnnn", "n") 結果:6 8、Repeat 字符串*n 如:strings.Repeat("n", 6) 結果: nnnnnn 9、ToLower 所有字母小寫 如:strings.ToLower("SuoNing") 結果:suoning 10、ToUpper 所有字母大寫 如:strings.ToUpper("suoning") 結果:SUONING 11、TrimSpace 去掉前后端的所有空格 如:strings.TrimSpace(" \nsuoning\n ")) 結果:nsuoning 12、Trim 將前后端所有符合條件的字符串去掉 如:strings.Trim("!!suoning!!", "!") 結果:su!oning 13、TrimLeft 所有前端符合條件的字符串去掉 如:strings.TrimLeft("!suoning!", "!") 結果:su!oning! 14、TrimRight 所有符合后端的字符串去掉 如:strings.TrimRight("!suoning!", "!") 結果:!su!oning 15、Fields 按照空格分割的多個字符串 如:strings.Fields(" suo ning ") 結果:[suo ning] 16、Split 分割 如:strings.Split(",suo,ning,", ",") 結果:[ suo ning ] 17、Join 拼接 如:strings.Join([]string{"abcd","ddd"}," ") 結果:abcd ddd
3、time 時間
1、Now 當前時間 如:time.Now() 結果:2019-03-04 15:33:25.044013971 +0800 CST m=+0.000231204 2、Unix 時間戳 如:time.Now().Unix() 結果:1551684901 3、Stamp 時間(沒有年月日,只精確到s) 如:time.Stamp 結果:Jan _2 15:04:05 4、Date 指定時間 如:time.Date(2008, time.November, 11, 23, 0, 0, 0, time.UTC) 結果:2008-11-11 23:00:00 +0000 UTC 5、Format 格式輸出時間 如:time.Now().Format("2006-1-02 15:04:05" ) //必須使用這個時間才行2006-1-02 15:04:05 結果:2019-3-04 15:48:01 6、ParseDuration 添加或減少時間 例如:t,_ := time.ParseDuration("-10m") //小時為-10h ,天為 Println(time.Now().Add(t)) 結果: 2019-03-04 15:55:21.436413622 +0800 CST m=-599.999598120 7、Sleep 睡眠時間, time.Second為秒 如:time.Sleep(time.Second*10) 睡眠10秒
時間的常量
Microsecond 微秒
Millisecond 毫秒
Second 秒
Minute 分鍾
Hour 小時
4、math/rand 實現了偽隨機數生成器
例子:
package main import ( "math/rand" "fmt" "time" ) func init() { rand.Seed(time.Now().UnixNano()) //使用給定的seed來初始化生成器到一個確定的狀態。 } func main() { fmt.Println(rand.Int()) //9153536921449289609(返回一個非負的偽隨機int值) fmt.Println(rand.Int31()) //2037735069(返回一個int32類型的非負的31位偽隨機數) fmt.Println(rand.Int63()) //1132646811815532030(返回一個int64類型的非負的63位偽隨機數) fmt.Println(rand.Intn(100)) //95(取值范圍在[0,n)的偽隨機int值,n<=0會panic) fmt.Println(rand.Float32()) //0.09178123(取值范圍在[0.0, 1.0)的偽隨機float32值) fmt.Println(rand.Perm(5)) //[0 4 1 2 3](有n個元素的,[0,n)范圍內整數的偽隨機排列的切片) } 結果: 8550661205998522408 1835614409 8970669406830364302 79 0.19600172 [1 3 0 2 4]
五、os系統模塊
1、Hostname 主機名 如:os.Hostname() 結果:localhost.localdomain <nil> 2、Getpagesize 返回底層的系統內存頁的尺寸 如:os.Getpagesize() 結果:4096 3、Environ 查看環境變量 如:os.Environ() 4、Getenv 獲取環境變量的值 如:os.Getenv("SHELL") 結果:/bin/bash 5、Setenv 設置環境變量 如:os.Setenv("a", "b") //設置環境變量a值為b 6、Clearenv 刪除所有環境變量 如:os.Clearenv() 7、Exit 退出程序,並返回給的狀態碼 如:os.Exit(2) 結果:exit status 2 8、Getuid 調用者的用戶ID 如:os.Getuid()//使用的root 結果:0 9、Geteuid 調用者的有效用戶ID 如:os.Geteuid() 結果:0 10、Getgid 調用者的組ID 如:os.Getgid() 結果:0 11、Getegid 調用者的有效組ID 如:os.Getegid() 結果:0 12、Getgroups 調用者所屬的所有用戶組的組ID 如:os.Getgroups() 結果:[0] <nil> 13、Getpid 調用者所在進程的進程ID 如:os.Getpid() 結果:116742 14、Getppid 調用者所在進程的父進程的進程ID 如:os.Getppid() 結果:116725 15、Getwd 當前所在路徑(類似shell的pwd) 如:os.Getwd() 結果:/data/go <nil> 16、Chdir 更改當前所在目錄(類似shell的cd) 如:os.Chdir("/tmp/") //切換到/tmp目錄下 17、Mkdir 創建目錄(shell的mkdir一樣) 如:os.Mkdir("/tmp/test") 18、MkdirAll 遞歸創建目錄(shell的mkdir -p) 如:os.MkdirAll("/tmp/test1/test2/test3") 19、Rename 更改文件或目錄的名字 如:os.Rename("/tmp/test1", "/tmp/test2") 20、Remove 刪除文件或目錄 如:os.Remove("/tmp/test2/test2") 21、RemoveAll 遞歸刪除 如:os.RemoveAll("/tmp/test1/") 22、Create 創建文件,存在會清空 如:os.Create("/tmp/test") 23、Open 打開文件 如:os.Open("/tmp/test")
六、flag來解析命令行參數
flag包,可以方便的解析命令行參數,而且參數順序可以隨意
例子:

[root@localhostgo_test]#cat flag.go package main import ( "fmt" "flag" ) func main(){ var user string var password string var host string var port int //"u"指的-u是user參數 flag.StringVar(&user,"u","root","用戶名,默認為root") flag.StringVar(&password,"p","","默認為空") flag.StringVar(&host,"h","localhost","host參數,默認localhost") flag.IntVar(&port,"port",999,"端口") //轉換,必須調用該方法 flag.Parse() fmt.Println(user,password,host,port) } [root@localhostgo_test]#go run flag.go -u root -p 123456 -h 192.168.1.1 -port 9999 root 123456 192.168.1.1 9999
七、encoding/json 用於處理json數據
1、json的序列化
json 序列化是指,將有 key-value 結構的數據類型(比如結構體、map、切片)序列化成 json 字符串的操作
例子:

package main import ( "fmt" "encoding/json" ) //定義一個結構體 type Monster struct { Name string `json:"json_name"` //`json:"xxx"` 反射使用 Age int `json:"age_test"` Sal float64 Skill string } func testStruct() { //演示 monster := Monster{ Name :"張三", Age : 20, Sal : 8000.0, Skill : "普通拳", } //將 monster 序列化 data, err := json.Marshal(&monster) if err != nil { fmt.Printf("序列號錯誤 err=%v\n", err) } //輸出序列化后的結果 fmt.Printf("struct序列化后=%v\n", string(data)) } //將 map 進行序列化 func testMap() { //定義一個 map var a map[string]interface{} //使用 map,需要 make a = make(map[string]interface{}) a["name"] = "李四" a["age"] = 30 a["sal"] = 5000 a["skill"] = "劍" //將 a 這個 map 進行序列化 data, err := json.Marshal(a) if err != nil { fmt.Printf("序列化錯誤 err=%v\n", err) } //輸出序列化后的結果 fmt.Printf("map 序列化后=%v\n", string(data)) } //切片序列化 func testSlice() { var slice []map[string]interface{} var m1 map[string]interface{} //使用 map 前,需要先 make m1 = make(map[string]interface{}) m1["name"] = "jack" m1["age"] = "7" m1["address"] = "北京" slice = append(slice, m1) var m2 map[string]interface{} //使用 map 前,需要先 make m2 = make(map[string]interface{}) m2["name"] = "王五" m2["age"] = "21" m2["address"] = [2]string{"墨西哥","夏威夷"} slice = append(slice, m2) //將切片進行序列化操作 data, err := json.Marshal(slice) if err != nil { fmt.Printf("序列化錯誤 err=%v\n", err) } //輸出序列化后的結果 fmt.Printf("slice 序列化后=%v\n", string(data)) } //對基本數據類型序列化,對基本數據類型進行序列化意義不大 func testFloat64() { var num1 float64 = 2345.67 //對 num1 進行序列化 data, err := json.Marshal(num1) if err != nil { fmt.Printf("序列化錯誤 err=%v\n", err) } //輸出序列化后的結果 fmt.Printf("float64 序列化后=%v\n", string(data)) } func main(){ testStruct() fmt.Println("========================") testMap() fmt.Println("========================") testSlice() fmt.Println("========================") testFloat64() } ###########結果############ struct序列化后={"json_name":"張三","age_test":20,"Sal":8000,"Skill":"普通拳"} ======================== map 序列化后={"age":30,"name":"李四","sal":5000,"skill":"劍"} ======================== slice 序列化后=[{"address":"北京","age":"7","name":"jack"},{"address":["墨西哥","夏威夷"],"age":"21","name":"王五"}] ======================== float64 序列化后=2345.67
2、反序列化
反序列化是指,將 json 字符串反序列化成對應的數據類型(比如結構體、map、切片)的操作
1、 在反序列化一個json 字符串時,要確保反序列化后的數據類型和原來序列化前的數據類型一致。
2、如果 json 字符串是通過程序獲取到的,則不需要再對 “ 轉義處
例子:
package main import ( "fmt" "encoding/json" ) //定義一個結構體 type Monster struct { Name string Age int Birthday string Sal float64 Skill string } //演示將 json 字符串,反序列化成 struct func unmarshalStruct() { //說明 str 在項目開發中,是通過網絡傳輸獲取到.. 或者是讀取文件獲取到 str := "{\"Name\":\"牛魔王\",\"Age\":500,\"Birthday\":\"2011-11-11\",\"Sal\":8000,\"Skill\":\"牛魔拳\"}" //定義一個 Monster 實例 var monster Monster err := json.Unmarshal([]byte(str), &monster) if err != nil { fmt.Printf("unmarshal err=%v\n", err) } fmt.Printf("反序列化后 monster=%v monster.Name=%v \n", monster, monster.Name) } //演示將 json 字符串,反序列化成 map func unmarshalMap() { str := "{\"address\":\"洪崖洞\",\"age\":30,\"name\":\"紅孩兒\"}" //定義一個 map var a map[string]interface{} //反序列化 //注意:反序列化 map,不需要 make,因為 make 操作被封裝到 Unmarshal 函數 err := json.Unmarshal([]byte(str), &a) if err != nil { fmt.Printf("unmarshal err=%v\n", err) } fmt.Printf("反序列化后 a=%v\n", a) } //演示將 json 字符串,反序列化成切片 func unmarshalSlice() { str := "[{\"address\":\"北京\",\"age\":\"7\",\"name\":\"jack\"}," + "{\"address\":[\"墨西哥\",\"夏威夷\"],\"age\":\"20\",\"name\":\"tom\"}]" //定義一個 slice var slice []map[string]interface{} //反序列化,不需要 make,因為 make 操作被封裝到 Unmarshal 函數 err := json.Unmarshal([]byte(str), &slice) if err != nil { fmt.Printf("unmarshal err=%v\n", err) } fmt.Printf("反序列化后 slice=%v\n", slice) } func main() { unmarshalStruct() fmt.Println("===============") unmarshalMap() fmt.Println("===============") unmarshalSlice() } ##############結果########### 反序列化后 monster={牛魔王 500 2011-11-11 8000 牛魔拳} monster.Name=牛魔王 =============== 反序列化后 a=map[address:洪崖洞 age:30 name:紅孩兒] =============== 反序列化后 slice=[map[address:北京 age:7 name:jack] map[address:[墨西哥 夏威夷] age:20 name:tom]]
。。。未完