今天就是继续学习https://gobyexample.com/,我发现网上下载go套件都是linux命令,才疏学浅的我真的是没明白为啥~(弄明白了,那个是在goland命令行打的命令,可以做一些事情)
这一篇就是简单的笔记,大致都能看懂没什么问题,此外今天老大还说了一下用到的插件啊,包啊,框架啊啥的。
数据库:mysql、redis(没接触过)
go套件:gorilla/mux(问了问好像是类似java控制层的东西,因为没看也没深问,后续明白了会再写写)
gorm(这个类似于mybatis相对于我来说好理解一点)
jwt-go(http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html这个网站好像挺好的,还没看,后续肯定会看完如果有总结会再说)
gorilla/websocket(https://www.jianshu.com/p/b5e289be5fa1使用这块还没看,后续也会看)
shopspring/decimal(没找到相关资料,如果我后期明白了我再补吧)
排序:sort包实现了内建及用户自定义数据类型的排序功能(针对内置数据类型),直接改变切片而不是返回新的切片。需要import stort
sort.Strings(strs)//排序,从小->大
s := sort.IntsAreSorted(ints)//检查切片是否有序,返回t/f
使用函数自定义排序:自然顺序以外的排序,例如按字符串长度进行排序
type byLength []string//创建了一个byLength类型(内建类型[]string的别名),之后main中的切片会被强转成这个类型的切片
大概就是说有三个函数Len、Swap、 Less前面两个都差不多,重写Less (Less控制实际的自定义排序逻辑)
这样我们再在main下面是用sort就可以实现重写方法的排序了(那为啥不写一个方法调用呢,这样多麻烦???)
Panic:意想不到的错误,说白了就是不想搭理的错误(与java不同的是,用返回来标错误,不捕捉异常)
panic("a problem")//就这么写!非0状态退出程序
Defer:清理工作有点像finally
f := createFile("/tmp/defer.txt")//创建一个文件
defer closeFile(f)//创建之后defer会在main结束时执行close(关闭文件通常会进行错误检查)
组合函数:泛型(go不支持)≈组合函数
func Include(vs []string, t string) bool {
return Index(vs, t) >= 0
} //t在切片vs中返回t,否则返回f
func Any(vs []string, f func(string) bool) bool {
for _, v := range vs {
if f(v) {
return true
}
}
return false
}//切片vs中满足条件f返回t,否则返回f
fmt.Println(Any(strs, func(v string) bool {
return strings.HasPrefix(v, "p")
}))//组合函数这不就来了
字符串函数:老朋友了,和java中应该差不多
fmt.Println("Contains: ", s.Contains("test", "es"))//test包含es:t
fmt.Println("Count: ", s.Count("test", "t"))//test包含t的个数:2
fmt.Println("HasPrefix: ", s.HasPrefix("test", "te"))//te是不是teset的前缀:t
fmt.Println("HasSuffix: ", s.HasSuffix("test", "st"))//st是不是test的后缀:t
fmt.Println("Index: ", s.Index("test", "e"))//e在teset的位置:1(从0开始,不存在返回-1)
fmt.Println("Join: ", s.Join([]string{"a", "b"}, "-"))//用-链接a和b:a-b
fmt.Println("Repeat: ", s.Repeat("a", 5))//a重复5次:aaaaa
fmt.Println("Replace: ", s.Replace("foo", "o", "0", -1))//替换foo中所有存在的o为0:f00
fmt.Println("Replace: ", s.Replace("foo", "o", "0", 1))//替换foo中存在的o为0一次:f0o
fmt.Println("Split: ", s.Split("a-b-c-d-e", "-"))//指定的-字符分割字符串:a b c d e
fmt.Println("ToLower: ", s.ToLower("TEST"))//换成小写:test
fmt.Println("ToUpper: ", s.ToUpper("test"))//换成大写:TEST
fmt.Println("Len: ", len("hello"))//字符串长度:5
fmt.Println("to []string:",s.Fields("hello"))//字符串变成数组
fmt.Println(s.TrimSpace(" hell o "))//去除首位空格:hello o
字符串格式化: p := point{1, 2}//假装有一个结构体
fmt.Printf("%v\n", p)//正常输出:{1,2}
fmt.Printf("%+v\n", p)//输出包括结构体字段:{x:1,y:2}
fmt.Printf("%#v\n", p)//源码片段:main.point{x:1, y:2}
fmt.Printf("%T\n", p)//需要打印值的类型:main.point
fmt.Printf("%t\n", true)//格式化布尔:true
fmt.Printf("%d\n", 123)//十进制:123
fmt.Printf("%b\n", 14)//二进制:1110
fmt.Printf("%c\n", 33)//对应的字符:!
fmt.Printf("%x\n", 456)//十六进制:1c8
fmt.Printf("%f\n", 78.9)//浮点十进制:78.900000
fmt.Printf("%e\n", 123400000.0)//科学计数法:1.234000e+08
fmt.Printf("%E\n", 123400000.0)//科学计数法:1.234000E+08
fmt.Printf("%s\n", "\"string\"")//字符串:"string"
fmt.Printf("%q\n", "\"string\"")//带有双引号:"\"string\""
fmt.Printf("%x\n", "hex this")//base-16编码的字符串:6865782074686973
fmt.Printf("%p\n", &p)//指针:0x42135100
fmt.Printf("|%6d|%6d|\n", 12, 345)//整数指定宽度:| 12| 345|
fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45)//浮点数指定宽度(%宽度.精度):| 1.20| 3.45|
fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45)//-表示左对齐:|1.20 |3.45 |
fmt.Printf("|%6s|%6s|\n", "foo", "b")//基本宽度右对齐:| foo| b|
fmt.Printf("|%-6s|%-6s|\n", "foo", "b")//左对齐字符:|foo |b |
正则表达式:https://gobyexample-cn.github.io/regular-expressions
JSON:数据交互格式
type response1 struct { Page int Fruits []string }//来个结构体,可导出被编码/解码(大写字母开头可导出)
type response2 struct { Page int `json:"page"` Fruits []string `json:"fruits"`}//打上`json:"name"`这样的标签,变成jason key就为name
bolB, _ := json.Marshal(true)//这种形式进行个种转换,int、flt、str、slc(多个)甚至map、切片也可
XML:通过encoding.xml包 (import "encoding/xml")
https://gobyexample-cn.github.io/xml
Time(时间)和Duration(时间段): (import "time")
now := time.Now()//获取当前时间
then := time.Date(2009, 11, 17, 20, 34, 58, 651387237, time.UTC)//提供信息创建一个时间,时间和时区联系
then.Year/Month/Day/...()//获取时间的组成部分
then.Weekday()//获取星期几
then.Before(now)//比较then是否为now之前(精确到s)
then.After(now)//比较then是否为now之后(精确到s)
then.Equal(now)//比较then和now是否相同(精确到s)
diff := now.Sub(then)//now和then的时间间隔
fmt.Println(diff.Hours/Minutes/Seconds/...())//可以以不同的单位输出时间间隔
then.Add(diff)//增加时间间隔,若(-diff)则为向前推移时间间隔
时间戳:1970年1月1日开始所经过的秒/毫秒/微秒数,不考虑闰秒
secs := now.Unix()//1970年1月1日开始所经过的秒
nanos := now.UnixNano()//1970年1月1日开始所经过的纳秒
millis := nanos / 1000000//得到毫秒,UnixMillis不存在需要手动转换
时间的格式化和解析:https://gobyexample-cn.github.io/time-formatting-parsing
随机数: math/rand 包提供随机数生成器
rand.Intn/Float64(100)//随机的0-100整数/浮点数
默认情况下,种子确定产生最数列也相同。只有给定不同的种子数列才不同。如果随机数加密,则使用crypto/rand
数字解析: (import"strcnv")
f, _ := strconv.ParseFloat("1.234", 64)//64解析数的位数
i, _ := strconv.ParseInt("123", 0, 64)//0:自动推断字符串数字的进制 64:以64位储存(ParseInt/ParseUint可以自动识别字符为16进制)
k, _ := strconv.Atoi("135")// 10 进制整型数转换函数,输入"wat"(输入错误)会返回一个错误排序:sort包实现了内建及用户自定义数据类型的排序功能(针对内置数据类型),直接改变切片而不是返回新的切片。需要import stort
sort.Strings(strs)//排序,从小->大
s := sort.IntsAreSorted(ints)//检查切片是否有序,返回t/f
使用函数自定义排序:自然顺序以外的排序,例如按字符串长度进行排序
type byLength []string//创建了一个byLength类型(内建类型[]string的别名),之后main中的切片会被强转成这个类型的切片
大概就是说有三个函数Len、Swap、 Less前面两个都差不多,重写Less (Less控制实际的自定义排序逻辑)
这样我们再在main下面是用sort就可以实现重写方法的排序了(那为啥不写一个方法调用呢,这样多麻烦???)
Panic:意想不到的错误,说白了就是不想搭理的错误(与java不同的是,用返回来标错误,不捕捉异常)
panic("a problem")//就这么写!非0状态退出程序
Defer:清理工作有点像finally
f := createFile("/tmp/defer.txt")//创建一个文件
defer closeFile(f)//创建之后defer会在main结束时执行close(关闭文件通常会进行错误检查)
组合函数:泛型(go不支持)≈组合函数
func Include(vs []string, t string) bool {
return Index(vs, t) >= 0
} //t在切片vs中返回t,否则返回f
func Any(vs []string, f func(string) bool) bool {
for _, v := range vs {
if f(v) {
return true
}
}
return false
}//切片vs中满足条件f返回t,否则返回f
fmt.Println(Any(strs, func(v string) bool {
return strings.HasPrefix(v, "p")
}))//组合函数这不就来了
字符串函数:老朋友了,和java中应该差不多
fmt.Println("Contains: ", s.Contains("test", "es"))//test包含es:t
fmt.Println("Count: ", s.Count("test", "t"))//test包含t的个数:2
fmt.Println("HasPrefix: ", s.HasPrefix("test", "te"))//te是不是teset的前缀:t
fmt.Println("HasSuffix: ", s.HasSuffix("test", "st"))//st是不是test的后缀:t
fmt.Println("Index: ", s.Index("test", "e"))//e在teset的位置:1(从0开始,不存在返回-1)
fmt.Println("Join: ", s.Join([]string{"a", "b"}, "-"))//用-链接a和b:a-b
fmt.Println("Repeat: ", s.Repeat("a", 5))//a重复5次:aaaaa
fmt.Println("Replace: ", s.Replace("foo", "o", "0", -1))//替换foo中所有存在的o为0:f00
fmt.Println("Replace: ", s.Replace("foo", "o", "0", 1))//替换foo中存在的o为0一次:f0o
fmt.Println("Split: ", s.Split("a-b-c-d-e", "-"))//指定的-字符分割字符串:a b c d e
fmt.Println("ToLower: ", s.ToLower("TEST"))//换成小写:test
fmt.Println("ToUpper: ", s.ToUpper("test"))//换成大写:TEST
fmt.Println("Len: ", len("hello"))//字符串长度:5
fmt.Println("to []string:",s.Fields("hello"))//字符串变成数组
fmt.Println(s.TrimSpace(" hell o "))//去除首位空格:hello o
字符串格式化: p := point{1, 2}//假装有一个结构体
fmt.Printf("%v\n", p)//正常输出:{1,2}
fmt.Printf("%+v\n", p)//输出包括结构体字段:{x:1,y:2}
fmt.Printf("%#v\n", p)//源码片段:main.point{x:1, y:2}
fmt.Printf("%T\n", p)//需要打印值的类型:main.point
fmt.Printf("%t\n", true)//格式化布尔:true
fmt.Printf("%d\n", 123)//十进制:123
fmt.Printf("%b\n", 14)//二进制:1110
fmt.Printf("%c\n", 33)//对应的字符:!
fmt.Printf("%x\n", 456)//十六进制:1c8
fmt.Printf("%f\n", 78.9)//浮点十进制:78.900000
fmt.Printf("%e\n", 123400000.0)//科学计数法:1.234000e+08
fmt.Printf("%E\n", 123400000.0)//科学计数法:1.234000E+08
fmt.Printf("%s\n", "\"string\"")//字符串:"string"
fmt.Printf("%q\n", "\"string\"")//带有双引号:"\"string\""
fmt.Printf("%x\n", "hex this")//base-16编码的字符串:6865782074686973
fmt.Printf("%p\n", &p)//指针:0x42135100
fmt.Printf("|%6d|%6d|\n", 12, 345)//整数指定宽度:| 12| 345|
fmt.Printf("|%6.2f|%6.2f|\n", 1.2, 3.45)//浮点数指定宽度(%宽度.精度):| 1.20| 3.45|
fmt.Printf("|%-6.2f|%-6.2f|\n", 1.2, 3.45)//-表示左对齐:|1.20 |3.45 |
fmt.Printf("|%6s|%6s|\n", "foo", "b")//基本宽度右对齐:| foo| b|
fmt.Printf("|%-6s|%-6s|\n", "foo", "b")//左对齐字符:|foo |b |
正则表达式:https://gobyexample-cn.github.io/regular-expressions
JSON:数据交互格式
type response1 struct { Page int Fruits []string }//来个结构体,可导出被编码/解码(大写字母开头可导出)
type response2 struct { Page int `json:"page"` Fruits []string `json:"fruits"`}//打上`json:"name"`这样的标签,变成jason key就为name
bolB, _ := json.Marshal(true)//这种形式进行个种转换,int、flt、str、slc(多个)甚至map、切片也可
XML:通过encoding.xml包 (import "encoding/xml")
https://gobyexample-cn.github.io/xml
Time(时间)和Duration(时间段): (import "time")
now := time.Now()//获取当前时间
then := time.Date(2009, 11, 17, 20, 34, 58, 651387237, time.UTC)//提供信息创建一个时间,时间和时区联系
then.Year/Month/Day/...()//获取时间的组成部分
then.Weekday()//获取星期几
then.Before(now)//比较then是否为now之前(精确到s)
then.After(now)//比较then是否为now之后(精确到s)
then.Equal(now)//比较then和now是否相同(精确到s)
diff := now.Sub(then)//now和then的时间间隔
fmt.Println(diff.Hours/Minutes/Seconds/...())//可以以不同的单位输出时间间隔
then.Add(diff)//增加时间间隔,若(-diff)则为向前推移时间间隔
时间戳:1970年1月1日开始所经过的秒/毫秒/微秒数,不考虑闰秒
secs := now.Unix()//1970年1月1日开始所经过的秒
nanos := now.UnixNano()//1970年1月1日开始所经过的纳秒
millis := nanos / 1000000//得到毫秒,UnixMillis不存在需要手动转换
时间的格式化和解析:https://gobyexample-cn.github.io/time-formatting-parsing
随机数: math/rand 包提供随机数生成器
rand.Intn/Float64(100)//随机的0-100整数/浮点数
默认情况下,种子确定产生最数列也相同。只有给定不同的种子数列才不同。如果随机数加密,则使用crypto/rand
数字解析: (import"strcnv")
f, _ := strconv.ParseFloat("1.234", 64)//64解析数的位数
i, _ := strconv.ParseInt("123", 0, 64)//0:自动推断字符串数字的进制 64:以64位储存(ParseInt/ParseUint可以自动识别字符为16进制)
k, _ := strconv.Atoi("135")// 10 进制整型数转换函数,输入"wat"(输入错误)会返回一个错误
网友评论