常用语法记录
目录:
最大最小值常量
const UINT_MIN uint = 0
const UINT_MAX = ^uint(0)
const INT_MAX = int(^uint(0) >> 1)
const INT_MIN = ^INT_MAX
time包:秒、毫秒、纳秒时间戳输出
https://www.junjie.in/article/34
fmt.Printf("时间戳(秒):%v;\n", time.Now().Unix())
fmt.Printf("时间戳(纳秒):%v;\n",time.Now().UnixNano())
fmt.Printf("时间戳(毫秒):%v;\n",time.Now().UnixNano() / 1e6)
fmt.Printf("时间戳(纳秒转换为秒):%v;\n",time.Now().UnixNano() / 1e9)
类型断言
https://studygolang.com/articles/20041
i := "1"
if v, ok := i.(int); ok {
fmt.Println("to int", i)
}
// string的uid 转 10进制int
类型断言和类型转换
- 类型转换
- 语法:<结果类型> := <目标类型> ( <表达式> )
- 类型转换是用来在不同但相互兼容的类型之间的相互转换的方式,所以,当类型不兼容的时候,是无法转换的。
- 例如 各种int类型,[]byte和string类型
- 类型断言
- 语法:
- <目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言
- <目标类型的值> := <表达式>.( 目标类型 ) //非安全类型断言
- 类型断言的本质,跟类型转换类似,都是类型之间进行转换,不同之处在于,类型断言实在接口之间进行。
- 在switch中 <目标类型的值> := <表达式>.( type )后,case 目标类型
字符串和数组互转
strings.Split(uidStr, ",")
strings.Join(strSlice, ",")
类型转换
-
int 之间互相转
// 直接 id = int64(id_int64)
(1)int转string
s := strconv.Itoa(i)
// 等价于
s := strconv.FormatInt(int64(i), 10)
(2)int64转string
i := int64(123)
s := strconv.FormatInt(i, 10)
第二个参数为基数,可选2~36
注:对于无符号整形,可以使用FormatUint(i uint64, base int)
(3)string转int
i, err := strconv.Atoi(s)
(4)string转int64
i, err := strconv.ParseInt(s, 10, 64)
第二个参数为基数(2~36),第三个参数位大小表示期望转换的结果类型,其值可以为0, 8, 16, 32和64,分别对应 int, int8, int16, int32和int64
(5)float相关
float转string:
v := 3.1415926535
s1 := strconv.FormatFloat(v, ``'E'``, -1, 32) //float32
s2 := strconv.FormatFloat(v, 'E', -1, 64) //float64
函数原型及参数含义具体可查看:https://golang.org/pkg/strconv/#FormatFloat
string转float:
s := ``"3.1415926535"
v1, err := strconv.ParseFloat(v, 32)
v2, err := strconv.ParseFloat(v, 64)
go语言string、int、int64互相转换
//string到int
int,err:=strconv.Atoi(string)
//string到int64
int64, err := strconv.ParseInt(string, 10, 64)
//int到string
string:=strconv.Itoa(int)
//int64到string
string:=strconv.FormatInt(int64,10)
//string到float32(float64)
float, err := strconv.ParseFloat(string,32/64)
//float到string
string := strconv.FormatFloat(float32, 'E', -1, 32)
string := strconv.FormatFloat(float64, 'E', -1, 64)
// 'b' (-ddddp±ddd,二进制指数)
// 'e' (-d.dddde±dd,十进制指数)
// 'E' (-d.ddddE±dd,十进制指数)
// 'f' (-ddd.dddd,没有指数)
// 'g' ('e':大指数,'f':其它情况)
// 'G' ('E':大指数,'f':其它情况)
String和[]byte
- string可以直接比较,而[]byte不可以,所以
[]byte
不可以当map的key值。 - 因为无法修改string中的某个字符,需要粒度小到操作一个字符时,用
[]byte
。 - string值不可为nil,所以如果你想要通过返回nil表达额外的含义,就用
[]byte
。 []byte
切片这么灵活,想要用切片的特性就用[]byte
。- 需要大量字符串处理的时候用
[]byte
,性能好很多。
defer和return执行顺序
return最先执行,return负责将结果写入返回值中;
接着defer开始执行一些收尾工作;
最后函数携带当前返回值退出。
日志原则
本层的错误本层打印,只作为下一层判断是否成功的依据
使用 |||| 分割 todo::看下中台SDK库怎么在打
server层:
- 打印请求相关错误 Debug
- 打印请求体和URL的 Debug
- Info:打印,c.JSON的时候
- Error:打印,返回端上的时候
service层:
- Info:完成一整个事件打 info (return的时候)
- Debug:方便排查错误的打
- Error:不打印,除非是本层产生的
dao/manager层:
- Info:完成整个事件打 info (return的时候)
- Debug:manager打印请求外部的URL、请求、相应,Dao打查询到的内容
- Error:所有的都要打印,因为已经是最下面一层了,产生错误