说明
最近这段时间在尝试使用beego做web开发,学习的差不多了,现在开始阅读源码。beego.me–产品案例 在这里找到了一些使用beego开发的项目,在阅读源码的过程中 ,发现不足,进行细化,针对性学习;下列是该项目SST的一些信息:
github:https://github.com/duliang123/SST
产品案例:https://beego.me/products
收获
1.用户登陆场景模型
#####
2.标准库bytes:
bytes库是go用来操作byte切片的工具包,包括对这种数据类型的查询,截取,替换,拼接,读取等方法
package main
import (
"bytes"
"fmt"
)
func main() {
readAndWrete()
test01()
}
//写入和读取数据
func readAndWrete() {
var a bytes.Buffer //创建一个缓冲区,buffer是一个结构体,这里相当于声明了一个结构体
var info map[string]string = make(map[string]string)
info["name"] = "aaaaa"
info["age"] = "bbbbbb"
info["aa"] = "ccccc"
info["bb"] = "ddddd"
for k,v := range info{
//fmt.Println(fmt.Sprintf("%s:%s",k,v))
a.WriteString(fmt.Sprintf("%s:%s\n",k,v)) //向缓冲区内写入内容
}
fmt.Println("a.String()--------:",a.String()) //打印缓冲区内的内容
}
func test01() {
var info string = "AaBwQqqZZZ"
fmt.Println("[]byte(info):",)
tmp01 := []byte(info) //将字符串转换为一个byte切片
fmt.Println("tmp01:",tmp01)
//tmp02 := bytes.ToLower(tmp01) //将切片内字符转换为小写
//tmp02 := bytes.ToUpper(tmp01) //将切片内字符传唤为大写
tmp02 := bytes.Title(tmp01) //转换为标题
fmt.Println("tmp02:",tmp02)
tmp03 := string(tmp02) //将byte类型转换为string类型
fmt.Println("tmp03:",tmp03)
var info01 string = " aa bb cc e 1 "
atmp01 := []byte(info01)
fmt.Println("atmp01:",atmp01)
fmt.Println(string(bytes.TrimSpace(atmp01))) //去除左右两边空白字符
fmt.Println(string(bytes.Join( //字符串拼接,以-拼接
[][]byte{
[]byte("aa"),
[]byte("bb"),
[]byte("cc"),
},
[]byte("-"),
)));
var hostname string = "caransible.mgr.prod.bj1 中"
tmp04 := []byte(hostname)
bj := []byte("中")
fmt.Println(bytes.Contains(tmp04,bj)) //判断字符串中是否包含该字符,包含则返回true
fmt.Println(bytes.Contains([]byte("caransible.mgr.prod.bj1"), []byte("bj1")));
fmt.Println(bytes.Count([]byte("a|b|c"), []byte("|"))); //关键字在字符串中出现的次数;
fmt.Println([]byte("a|b|c")) //[]byte("a|b|c") 是将字符串每个字符作为一个元素进行分割,组合成一个切片
}
//总结:如果要对string操作,需要先将string类型转换为[]byte类型,然后通过bytes提供的方法进行操作,完成后使用string()函数进行将[]byte内容转换为string类型,便于阅读;
3.标准库sync:
sync库是解决协程之间通信的一种方式,协程执行期间用于阻塞父线程;
package main
import (
"fmt"
"sync"
)
func main() {
wg := sync.WaitGroup{}
var numList []int64 = []int64{22,32,12,2,667,44,23}
wg.Add(len(numList)) //将要循环的次数添加到这里,协程没执行一次则从中减少一个数值,直至读取完,父进程才会退出
for i := 0; i < len(numList); i++ {
tmp := numList[i]
go test03(tmp,&wg)
}
wg.Wait() //add添加的没有执行完成时,父进程不会退出;这里设置阻塞;
}
func test03(num int64,wg *sync.WaitGroup){
tmp := num * num
fmt.Println(tmp)
wg.Done() //每个协程执行一次则减少一次;
}
//总结:sync在父进程设置wg := sync.WaitGroup{} wg.Add(len(numList)) wg.Wait() 在协程内执行wg.Done()
4.ssh库
#########
5.###
#####
6.###
#####
7.###
#####
源码解读
从路由入手:
转载:https://blog.csdn.net/qq_17472959/article/details/102491050
查看评论