随笔分类 - golang
摘要:说明: 很多系统都是将密码进行一次 MD5 或 SHA1 Hash后存入数据库中。这样的密码抵挡不住字典攻击。所谓字典攻击, 就是将常用密码进行Hash后做成一个字典,破解的时候,只需要查字典就能知道对应的明文密码。 为了抵御字典攻击,推荐的做法是使用 密码 + 盐(一串随机数) 再Hash的方式。
阅读全文
摘要:案例1: func main() { slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} s1 := slice[2:5] // s1=[2, 3, 4], len=3, cap=8 s2 := s1[2:6:7] // s2=[4, 5, 6, 7], len
阅读全文
摘要:go-redis库的使用 安装go-redis库 go get github.com/go-redis/redis/v8 github链接 创建redis客户端并设置值 // 短信验证码发送成功,将验证码保存到redis rdb := redis.NewClient(&redis.Options{
阅读全文
摘要:下载依赖 go get -u github.com/alibabacloud-go/dysmsapi-20170525/v2 go get -u github.com/alibabacloud-go/darabonba-openapi go get -u github.com/alibabaclou
阅读全文
摘要:package response import ( "fmt" "time" ) type JsonTime time.Time func (j JsonTime) MarshalJSON() ([]byte, error) { // 重写time转换成json之后的格式 var stmp = fm
阅读全文
摘要:channel+goroutine是go并发的大杀器 channel可以用来停止信号(发送信号停止子goroutine的执行) 超时控制(websocket中长时间不活跃的用户可以直接断开链接) 定时任务的执行 解耦生产方和消费方 控制最大并发数量 案例见下面: * channel和goroutin
阅读全文
摘要:代码案例 package main import ( "fmt" "net/http" _ "net/http/pprof" ) func main(){ for i := 0; i < 5; i++ { go func() { select { default: return } }() } go
阅读全文
摘要:cond是什么 Cond实现了一种条件变量,可以使用在多个reader等待共享资源ready的场景,(如果只有一读一写,一个锁或者channel就搞定了) 每个Cond都会关联一个Lock(*sync.Mutex or *sync.RWMutex), 当修改条件或者调用Wait方法时,必须加锁以保护
阅读全文
摘要:package main import ( "fmt" "reflect" "strconv" "time" ) func main() { a := 15 // 整数转浮点数 b := float64(a) // go支持显示类型转换,以满足严格的类型要求 fmt.Println(b, refle
阅读全文
摘要:func main() { // 字符串转bytes类型 name := "马亚南" fmt.Println(name) // 马亚南 bName := []byte(name) fmt.Println(bName) // [233 169 172 228 186 154 229 141 151]
阅读全文
摘要:package main import ( "fmt" "strconv" ) func f2i(f float64) int { i, _ := strconv.Atoi(fmt.Sprintf("%1.0f", f)) return i } func main() { var floats =
阅读全文
摘要:go 的time.Time,在json序列化是默认 2006-01-02T15:04:05Z07:00 的格式,十分不便, encoding/json包在序列化和反序列化的时候分别调用encode.go 下的Marshaler接口的MarshalJSON方法和decode.go下的Unmarshal
阅读全文
摘要:package tool import ( "crypto/md5" "crypto/sha256" "encoding/base64" "encoding/hex" "fmt" "io" ) func EncoderSha256(data string) string { h := sha256.
阅读全文
摘要:一行代码搞定 code := fmt.Sprintf("%06v", rand.New(rand.NewSource(time.Now().UnixNano())).Int31n(1000000)) fmt.Println(code)
阅读全文
摘要:package tool import ( "bufio" "encoding/json" "fmt" "os" ) type Config struct { AppName string `json:"app_name"` AppMode string `json:"app_mode"` AppH
阅读全文
摘要:1. redis简单介绍 redis支持数据的持久化,将内存中的数据保存到磁盘中,重启的时候可以再次加载进行使用 redis不仅仅支持key-value数据,还支持:string,list,set,hash等 redis支持数据备份,即master-slaver模式的数据备份 读11w/s,写8W/
阅读全文
摘要:package main import ( "fmt" "reflect" ) func B2S(bs []uint8) string { // 将字节切片转换成字符串 ba := make([]byte, 0) // 创建一个字节切片,默认容量0 fmt.Println(ba, reflect.T
阅读全文
摘要:1. 安装mysql驱动库和sqlx基于官方sql库的扩展库 go get github.com/go-sql-driver/mysql go get github.com/jmoiron/sqlx 2. 链接mysql package main import ( "fmt" _ "github.c
阅读全文
摘要:一、GMP模型原理first: 1. 全局队列:存放待运行的G2. P的本地队列:同全局队列类似,存放待运行的G,存储的数量有限:256个,当创建新的G‘时,G’优先加入到P的本地队列,如果队列已满,会把P本地队列中一半的G移动到全局队列3. M线程:M运行G需要先获取P,然后从P本地队列中取G运行
阅读全文
摘要:1. 概念 原子操作 atomic 包 加锁操作涉及到内核态的上下文切换,比较耗时,代价高, 针对基本数据类型我们还可以使用原子操作来保证并发的安全, 因为原子操作是go语言提供的方法,我们在用户态就可以完成,因此性能比加锁操作更好 go语言的原子操作由内置的库 sync/atomic 完成2. a
阅读全文