golang常用方法积累
golang常用方法积累
- 日志记录
- HTTP请求
- 字符处理
- strings库
- 正则匹配
- 类型定义
- 不定参数类型定义
- var
- const
- map
- map转json
- json
- type
- json性能优化
- 关键字
- go
- defer
- break
- continue
- goto
- 时间处理
日志记录
- log日志包
学习自:https://www.jianshu.com/p/d634316a9487
func main() {log.Println("helloworld:","https://blog.csdn.net/weixin_43819222")log.Printf("helloworld:%s\n","https://blog.csdn.net/weixin_43819222")
}
Println
与Printf
的区别:
1.Println
:可以打印出字符串,和变量
2.Printf
:只可以打印出格式化的字符串,可以输出字符串类型的变量,不可以输出整形变量和整形
3.Sprintf
:用传入的格式化规则符将传入的变量格式化,(终端中不会有显示),返回为 格式化后的字符串(常用于赋值)
- 定制抬头信息
func init(){log.SetFlags(log.Ldate|Lshortfile)
}
///
选项常量
const (Ldate = 1 << iota //日期示例: 2009/01/23Ltime //时间示例: 01:23:23Lmicroseconds //毫秒示例: 01:23:23.123123.Llongfile //绝对路径和行号: /a/b/c/d.go:23Lshortfile //文件和行号: d.go:23.LUTC //日期时间转为0时区的LstdFlags = Ldate | Ltime //Go提供的标准抬头信息
)
设置日志前缀
func init(){log.SetPrefix("【duanyiwen】")log.SetFlags(log.LstdFlags | log.Lshortfile |log.LUTC)
}
///
【duanyiwen】2017/04/29 05:53:26 main.go:11: helloworld: https://blog.csdn.net/weixin_43819222
【duanyiwen】2017/04/29 05:53:26 main.go:12: helloworld:duanyiwen
- 定制日志
var (Info *log.LoggerWarning *log.LoggerError * log.Logger
)
将ERROR级输出到文本
func init(){errFile,err:=os.OpenFile("errors.log",os.O_CREATE|os.O_WRONLY|os.O_APPEND,0666)if err!=nil{log.Fatalln("打开日志文件失败:",err)}Info = log.New(os.Stdout,"Info:",log.Ldate | log.Ltime | log.Lshortfile)Warning = log.New(os.Stdout,"Warning:",log.Ldate | log.Ltime | log.Lshortfile)Error = log.New(io.MultiWriter(os.Stderr,errFile),"Error:",log.Ldate | log.Ltime | log.Lshortfile)
}
全部归到文本
LogFile,err:=os.OpenFile("duanyiwen.log",os.O_CREATE|os.O_WRONLY|os.O_APPEND,0666)
Info = log.New(io.MultiWriter(os.Stderr,LogFile),"Info:",log.Ldate | log.Ltime | log.Lshortfile)
Warning = log.New(io.MultiWriter(os.Stderr,LogFile),"Warning:",log.Ldate | log.Ltime | log.Lshortfile)
Error = log.New(io.MultiWriter(os.Stderr,LogFile),"Error:",log.Ldate | log.Ltime | log.Lshortfile)
HTTP请求
学习:https://www.cnblogs.com/Paul-watermelon/p/11386392.html
- Get请求
package main
import ("fmt","io/ioutil","net/http"
)func main() {resp, err := http.Get("http://baidu.com")if err != nil {fmt.Println(err)return}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)fmt.Println(string(body))fmt.Println(resp.StatusCode)if resp.StatusCode == 200 {fmt.Println("ok")}
}
- Get变量入参
package mainimport ("fmt""io/ioutil""net/http""net/url"
)func main() {params := url.Values()Url, err := url.Parse("http://baidu.com")if err != nil {return}params.Set("name","Paul_Chan")params.Set("age","26")Url.RawQuery = params.Encode()//解码中文urlPath := Url.String()fmt.Println(urlPath) // https://www.baidu.com?age=26&name=Paul_chanresp,err := http.Get(urlPath)defer resp.Body.Close()body, _ := ioutil.ReadAll(resp.Body)fmt.Println(string(body))
}
- 解析json类型的返回结果
package mainimport ("encoding/json""fmt""io/ioutil""net/http"
)type result struct {Args string `json:"args"`Headers map[string]string `json:"headers"`Origin string `json:"origin"`Url string `json:"url"`
}func main() {resp, err := http.Get("http://baidu.com")if err != nil {return}defer resp.Body.Close()body, _ := ioutil.ReadAll(resp.Body)fmt.Println(string(body))var res result_ = json.Unmarshal(body,&res)fmt.Printf("%#v",res)//%#v 用Go的语法打印。//比如main.People{name:”sam”, phone:main.Phone{mobile:”12345”, office:”67890”}}
}
- Get添加请求头
func main() {client := &http.Client{}req,_ := http.NewRequest("GET","http://xxx.com",nil)req.Header.Add("name","Paul_Chan")req.Header.Add("age","26")resp,_ := client.Do(req)body, _ := ioutil.ReadAll(resp.Body)fmt.Printf(string(body))
}
- Post请求
package mainimport ("fmt""io/ioutil""net/http""net/url"
)
//表单提交
func main() {urlValues := url.Values{}urlValues.Add("name","Paul_Chan")urlValues.Add("age","26")resp, _ := http.PostForm("http://xxx.com/post",urlValues)body, _ := ioutil.ReadAll(resp.Body)fmt.Println(string(body))
}
//“text/html”提交
package mainimport ("fmt""io/ioutil""net/http""net/url""strings"
)
func main() {urlValues := url.Values{"name":{"Paul_Chan"},"age":{"26"},}reqBody:= urlValues.Encode()resp, _ := http.Post("http://baidu.com/post", "text/html",strings.NewReader(reqBody))body,_:= ioutil.ReadAll(resp.Body)fmt.Println(string(body))
}
- POST-json
package mainimport ("bytes""encoding/json""fmt""io/ioutil""net/http"
)func main() {client := &http.Client{}data := make(map[string]interface{})data["name"] = "zhaofan"data["age"] = "23"bytesData, _ := json.Marshal(data)req, _ := http.NewRequest("POST","http://httpbin.org/post",bytes.NewReader(bytesData))req.Header.Add("Content-Type", "application/json")resp, _ := client.Do(req)body, _ := ioutil.ReadAll(resp.Body)fmt.Println(string(body))
}///不要client,使用http.post
func main() {data := make(map[string]interface{})data["name"] = "zhaofan"data["age"] = "23"bytesData, _ := json.Marshal(data)resp, _ := http.Post("http://httpbin.org/post","application/json", bytes.NewReader(bytesData))body, _ := ioutil.ReadAll(resp.Body)fmt.Println(string(body))
}
- POST-Client提交表单
func LogIn2() (*http.Response, error) {data := url.Values{}data.Set("name", name)data.Set("password", password)data.Set("autologin", "1")data.Set("enter", "Sign in")r, _ := http.NewRequest(POST, login_url, strings.NewReader(data.Encode()))r.Header.Add("Content-Type", "application/x-www-form-urlencoded")resp, err := client.Do(r)if err != nil {Error.Fatalln(err)return nil, err}return resp, nil}
- Cookies保存
package mainimport ("fmt""net/http""net/http/cookiejar"
)func main() {jar, _ := cookiejar.New(nil)timeOut := time.Duration(1 * time.Second)fmt.Println("Start Request Server")client := &http.Client{}client.Jar = jarclient.Timeout = timeOuturl := "http://127.0.0.1:8889/test"req, _ := http.NewRequest("GET", url, nil)//第一次发请求client.Do(req)fmt.Printf("第一次 %s \n", req.Cookies())
}
字符处理
- 格式化赋值
b := "hello world"
a := fmt.Sprintf("%s",b)
fmt.Println(a)
- 查询变量类型
- fmt
fmt.Printf("%s类型为%T\n",c,c)
- 自定义
import "fmt" func main() {v := "hello world"fmt.Println(typeof(v)) } func typeof(v interface{}) string {return fmt.Sprintf("%T", v) }
- 反射
import ("reflect""fmt" ) func main() {v := "hello world"fmt.Println(typeof(v)) } func typeof(v interface{}) string {return reflect.TypeOf(v).String() }
- 字符切割
import ("strings""fmt"
)
func main() {b := "hello:world"c := strings.Split(b,":")fmt.Printf("%s类型为%T\n",c,c)
}
- 定义变量
/[]string类型
func main() {a := [2]string{"111","222"}fmt.Println(a)
}
[]byte
func main() {a := []byte("Hello World!")fmt.Println(a)
}
strings库
fmt.Println(strings.HasPrefix(s3, "a")) //判断前缀
fmt.Println(strings.HasSuffix(s3, "0")) //判断后缀
fmt.Println(strings.Contains(s3, "9")) //字符串包含关系
fmt.Println(strings.Index(s3, "0")) //判断子字符串或字符在父字符串中出现的位置(索引)
fmt.Println(strings.LastIndex(s3, "0")) //最后出现位置的索引
fmt.Println(strings.Replace(s3,"0","1",-1))//如果 n = -1 则替换所有字符串
fmt.Println(strings.Count(s3,"0"))//出现的非重叠次数
fmt.Println(strings.Repeat(s3,2))//重复字符串
fmt.Println(strings.ToLower(s3))//修改字符串大小写
fmt.Println(strings.ToUpper(s3))//修改字符串大小写
fmt.Println(strings.TrimSpace(s3))//修剪字符串 去掉开头和结尾空格
fmt.Println(strings.Trim(strings.TrimSpace(s3),"a"))//修剪字符串 去掉开头和结尾字符串
正则匹配
- 判断是否匹配
package main;
import (// "bytes""fmt""regexp"// "strings"
)
func main() {match,_ := regexp.MatchString("H(.*)d!","Hello World!")fmt.Println(match)//truematch2,_ := regexp.Match("H(.*)d!",[]byte("Hello World!"))fmt.Println(match2)//truerex, _ := regexp.Compile("H(.*)d!")fmt.Println(rex.MatchString("Hello World!"))//true
}
- 返回匹配字符
func main() {rex, _ := regexp.Compile("H(.*)d!")fmt.Println(rex.MatchString("Hello World!"))text := "Hello World! Hworld!"//返回匹配项目fmt.Println(rex.FindString(text))//返回匹配项目起始索引fmt.Println(rex.FindStringIndex(text))//返回全局匹配和局部匹配(局部匹配即精确匹配括号内的)fmt.Println(rex.FindStringSubmatch(text))//返回全局匹配和局部匹配的索引fmt.Println(rex.FindStringSubmatchIndex(text),len(rex.FindStringSubmatchIndex(text)))//返回所有匹配项fmt.Println(rex.FindAllString(text, -1),len(rex.FindAllString(text, -1)))//返回所有全局匹配和局部匹配的字符索引rex.FindAllStringSubmatchIndex(text,-1)//入参正整数来限制匹配数量text2 := "Hello World! Held! Hellowrld! world Haaaaaad"res, _ := regexp.Compile("H([a-z]+)d!")fmt.Println(res.FindAllString(text2, 2)) //-1即所有,1,2,3次
}
- 替换匹配字符
func main() {rex, _ := regexp.Compile("H([a-z]+)d!")result := rex.ReplaceAllString("Hello World! Held! world","html")fmt.Println(result)//将匹配项进行大小写转换in := []byte("Hello World! Held! world")out := rex.ReplaceAllFunc(in,bytes.ToUpper)fmt.Println(string(out))//全部转大写c := []byte("aaaaasss dddff ggvv adas")fmt.Println(string(bytes.ToUpper(c)))a := "aaaaasss dddff ggvv adas"fmt.Println(strings.ToUpper(a))}
类型定义
不定参数类型定义
- 定义python中的print函数
import ("time""fmt"
)func print(args interface{}) {fmt.Println(args)
}func main() {timeStr := time.Now().Format("2006-01-02 02:02:03")print(timeStr)print("222222")
}
var
// 初始化多个同类型变量
var name1, name2, name3 string = "name1", "name2", "name3"
//初始化多个不同类变量
var (name string = "keyworkd"count int = 2
)
//省略变量类型
var name1, name2, name3 = "name1", "name2", "name3"
const
const可以全局,局部定义。常量不可赋值修改
map
package mainimport("fmt"// "time"// "runtime"
)func typeof(v interface{}) string {return fmt.Sprintf("%T", v)
}func main() {m := make(map[string]int)m["k"] = 7m["b"] = 7v := m["k"]fmt.Println(m)fmt.Println("v:",v)fmt.Println(len(m))delete(m,"k")fmt.Println(m,typeof(m))
}
map转json
import("fmt""encoding/json"// "time"// "runtime"
)func main() {s := []map[string]interface{}{}m1 := map[string]interface{}{"name":"John","age":10}m2 := map[string]interface{}{"name":"Alex","age":12}s = append(s, m1, m2)s = append(s, m2)fmt.Println("s:", s)b, err := json.Marshal(s)if err != nil {fmt.Println("json.Marshal failed:",err)return}fmt.Println("b:", string(b))
}
json
使用高性能json包:jsonitor
学习自:https://www.jianshu.com/p/f797343eb04f
go get github.com/json-iterator/go
import ("fmt""github.com/json-iterator/go" // 引入"os""strings"
)type ColorGroup struct {ID intName stringColors []string
}type Animal struct {Name stringOrder string
}func main() {// ================= 序列化 =====================group := ColorGroup{ID: 1,Name: "Reds",Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},}b, err := jsoniter.Marshal(group)bb, err := jsoniter.MarshalIndent(group, "", " ")if err != nil{fmt.Println("error: ", err)}os.Stdout.Write(b)fmt.Println()os.Stdout.Write(bb)fmt.Println()// =================== Deconde 解码 =================jsoniter.NewDecoder(os.Stdin).Decode(&group)fmt.Println(group)//encoder := jsoniter.NewEncoder(os.Stdout)//encoder.SetEscapeHTML(true)//encoder.Encode(bb)//fmt.Println(string(bb))// =================== 反序列化 =======================var jsonBlob = []byte(`[{"Name": "Platypus", "Order": "Monotremata"},{"Name": "Quoll", "Order": "Dasyuromorphia"}]`)var animals []Animalif err := jsoniter.Unmarshal(jsonBlob, &animals); err != nil{fmt.Println("error: ", err)}fmt.Printf("the unmarshal is %+v", animals)// ======================= 流式 ========================fmt.Println()// 序列化stream := jsoniter.ConfigFastest.BorrowStream(nil)defer jsoniter.ConfigFastest.ReturnStream(stream)stream.WriteVal(group)if stream.Error != nil{fmt.Println("error: ", stream.Error)}os.Stdout.Write(stream.Buffer())fmt.Println()// 反序列化iter := jsoniter.ConfigFastest.BorrowIterator(jsonBlob)defer jsoniter.ConfigFastest.ReturnIterator(iter)iter.ReadVal(&animals)if iter.Error != nil{fmt.Println("error: ", iter.Error)}fmt.Printf("%+v", animals)fmt.Println()// ====================其他操作===================// getval := []byte(`{"ID":1,"Name":"Reds","Colors":
{"c":"Crimson","r":"Red","rb":"Ruby","m":"Maroon","tests":["tests_1","tests_2","tests_3","tests_4"]}}`)fmt.Println(jsoniter.Get(val, "Colors").ToString())fmt.Println("the result is " , jsoniter.Get(val, "Colors","tests",0).ToString())// fmt.Println(jsoniter.Get(val, "colors", 0).ToString())fmt.Println()hello := MyKey("hello")output, _ := jsoniter.Marshal(map[*MyKey]string{&hello: "world"})fmt.Println(string(output))obj := map[*MyKey]string{}jsoniter.Unmarshal(output, &obj)for k, v := range obj{fmt.Println(*k," = ", v)}}
// 自定义类型
// 序列化: 需要实现MarshellText
type MyKey stringfunc (m *MyKey) MarshalText() ([]byte, error){// return []byte(string(*m)) , nil // 针对序列化的内容不做任何调整return []byte(strings.Replace(string(*m), "h","H",-1)), nil
}func(m *MyKey) UnmarshalText(text []byte) error{*m = MyKey(text[:]) // 针对text不做处理return nil
}
package mainimport ("fmt""encoding/json"
)type FamilyRequestBody struct {Family string `json:"family"`
}type DataRequestBody struct {Family FamilyRequestBody `json:"family"`
}type EventRequestBody struct {Account string `json:"account"`Player string `json:"player"`Count int `json:"count"`
}type TeamRequestBody struct {Account string `json:"account"`Team string `json:"team"`
}type PlayerRequestBody struct {Account string `json:"account"`Team string `json:"team"`Player string `json:"player"`Data DataRequestBody `json:"data"`
}func main() {l := PlayerRequestBody{Account: "my-account",Team: "12345",Player: "23424234",Data: DataRequestBody{FamilyRequestBody{Family: "12345"}},}fmt.Printf("%#v,%T", l, l)fmt.Println(l)bb, _ := json.Marshal(l)fmt.Println(string(bb))
}
type
go结构体生成:http://json2struct.mervine.net/
- 定义嵌套结构
type ColorGroup struct {ID intName stringColors []string
}type Animal struct {Name stringOrder string
}type Data struct { data0 map[string]interface{} data1 string
}
package mainimport "fmt"type s1 struct {ID strings2 s2s3 s3
}type s2 struct {WebSiteName stringURL string
}type s3 struct {KeyWord []stringWhere string
}func main() {ss := s1{ID: "123456",s2: s2{WebSiteName: "ydook.com",URL: "www.ydook.com",},s3: s3{// 重点:在结构体内部使用数组KeyWord: []string{"IT", "AI", "Web", "technology", "knowledge"},Where: "IT",},}fmt.Println(ss)
}
https://rabbit52.com/2018/07/go-define-nested-struct/
{"success": true,"data": {"name": "hugo"},"identifi": {"key": "xxx","secret": "secret"},"errors": [{"code": "not_found","message": "something"}]
}
//
type Resp struct {Success boolIdentifi struct {Key stringSecret string}Data interface{}Errors []struct {Code stringMessage string}
}resp := new(Resp)
json.Unmarshal(respBody, resp)
- 数组加字典
package mainimport ("fmt"
)func main() {result := []map[string]interface{}{}mp1 := map[string]interface{}{"one" : 1,"two" : 2,}mp2 := map[string]interface{}{"three" : 3,"four" : 4,}mp3 := make(map[string]interface{})for k,v := range mp1 {if _,ok := mp1[k]; ok {mp3[k] = v }}for k,v := range mp2 {if _,ok := mp2[k]; ok {mp3[k] = v}}result = append(result,mp1,mp2)fmt.Println(result)
}
json性能优化
- 1.使用jsoniter包进行序列化,struct比map更快。
- 2.相对于解码,json.NewEncoder进行大JSON的编码比json.marshal性能高,因为内部使用pool
- 3.json.NewDecoder用于http连接与socket连接的读取与写入,或者文件读取
- 4.json.Unmarshal用于直接是byte的输入
- 5.jsoniter兼容标准库只需要
json := jsoniter.ConfigCompatibleWithStandardLibrary
关键字
go
defer
用于资源的释放,会在函数返回之前,return之后进行调用。
- 特点一:多个defer语句,压入栈后,遵循先入后出规则
- 特点二:defer语句压入时,会将传入的变量值一同压入栈中,不受下文变量值变化的影响
break
跳出当前循环
continue
跳过本次循环,继续下次循环
goto
跳转到指定标签处
时间处理
///时间常量(时间格式化)
const (ANSIC = "Mon Jan _2 15:04:05 2006"UnixDate = "Mon Jan _2 15:04:05 MST 2006"RubyDate = "Mon Jan 02 15:04:05 -0700 2006"RFC822 = "02 Jan 06 15:04 MST"RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zoneRFC850 = "Monday, 02-Jan-06 15:04:05 MST"RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zoneRFC3339 = "2006-01-02T15:04:05Z07:00"RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"Kitchen = "3:04PM"// Handy time stamps.Stamp = "Jan _2 15:04:05"StampMilli = "Jan _2 15:04:05.000"StampMicro = "Jan _2 15:04:05.000000"StampNano = "Jan _2 15:04:05.000000000"
)
- 时间加减
func main() {now := time.Now()m, _ := time.ParseDuration("-1m")m1 := now.Add(m)fmt.Println(m1)fmt.Println(now)
}
golang常用方法积累相关推荐
- Cloudpods Golang实践
Cloudpods是完全自研的一套云平台,Golang是该平台的主要后端开发语言.本文介绍我们在平台开发迭代过程中关于Golang的经验以及在Golang上积累的框架和库,包括积累的Golang工具库 ...
- golang基本数据类型string字符串常用方法代码示例
- Golang基础教程——字符串常用方法总结
目录 string包 字符串比较 字符串查找 字符串重复 字符串替换 字符串删除 字符串大小写转换 字符串前缀后缀 字符串分割 字符串拼接 strconv包 string包 字符串比较 函数接口 // ...
- Golang filepath包常用方法介绍
本文介绍与文件路径相关包,该工具包位于path/filepath中,该包试图与目标操作系统定义的文件路径兼容.本文介绍一些常用函数,如获取文件绝对路径,获取文件名或目录名.遍历文件.分割文件路径.文件 ...
- Golang的strings和strconv常用方法
package mainimport ("fmt""strconv""strings" )func main() {str := " ...
- golang socket读写同时_epoll在Golang的应用
使用Golang可以轻松地为每一个TCP连接创建一个协程去服务而不用担心性能问题,这是因为Go内部使用goroutine结合IO多路复用实现了一个"异步"的IO模型,这使得开发者不 ...
- 如何写出优雅的 Golang 代码
Go 语言是一门简单.易学的编程语言,对于有编程背景的工程师来说,学习 Go 语言并写出能够运行的代码并不是一件困难的事情,对于之前有过其他语言经验的开发者来说,写什么语言都像自己学过的语言其实是有问 ...
- golang 正则使用总结
正则表达式的语法可以说基本和编程语言无关,大同小异,不过就是调用的方法不同而已. 以一个案例总结下golang的正则常用方法. 注: 下面的regObj指regexp.Compile后的值,可理解为正 ...
- golang ide 简介
2019年,GO的发展已有十年之久.在这期间出现了很多能被GO语言使用的IDE,把它们都详细介绍一遍是不现实的.接下来,重点介绍我比较了解几款IDE. Goland Goland,商业公司jetbra ...
最新文章
- 构造数独 算法及代码实现
- emacs org-mode文件转html文件
- OpenGL保守光栅化
- raid操作相关命令笔记
- 使用ArcGIS JavaScript API 3.18 加载天地图
- java 连接 sql2005,java与sql server2005 连接有关问题
- Spring 3.1和Hibernate的持久层
- 【JS 逆向百例】层层嵌套,某加速商城 RSA 加密
- oracle权限的分配
- 想当老板的人,三点特征很重要(转)
- python3.7怎么安装tensorflow_gpu_(更新版)python3.7 Windows10 tensorflow-GPU 安装
- 淘宝的开源分布式文件系统TFS
- js中如何判断按钮是否被点击了
- 【NLP】谷歌综述论文 Efficient Transformers 阅读笔记
- (音视频学习笔记):ffplay命令选项及使用案例
- matlab 三边测量,三边测量的定位算法,matlab转为c
- Qt开源作品41-网络调试助手增强版V2022
- bluecms 手把手教你0day挖掘-基础入门篇
- win10系统的qq无网络连接网络连接到服务器,Win10能上qq打不开网页_Win10能上qq不能上网怎么办?-192路由网...
- Android Studio连接海马玩模拟器
热门文章
- LCS(最长公共子序列)及其O(n)空间优化,O(nlogn)时间复杂度优化
- 【开启SSH】小米AIoT路由器 AC2350 (R2350)
- python --- 实现LU=PA分解(部分主元的高斯消去)/带行交换的LU分解
- 常用控件:列表框控件ListBox
- 2022年推荐云计算行业研究报告投资策略产业发展前景市场行情分析(附件中为网盘链接,报告持续更新)
- 山川湖海 - Android无障碍功能优化实践
- c语言partition头文件,c语言_头文件_windows.h
- 西门子博图功能指令——多路分用
- c#窗体调查问卷_如何在Microsoft窗体中创建问卷
- stm32+cubemx+adc+time定时采集+dma多通道采集