常用语法记录

最大最小值常量

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

类型断言和类型转换

  1. 类型转换
  • 语法:<结果类型> := <目标类型> ( <表达式> )
  • 类型转换是用来在不同但相互兼容的类型之间的相互转换的方式,所以,当类型不兼容的时候,是无法转换的。
  • 例如 各种int类型,[]byte和string类型
  1. 类型断言
  • 语法:
    • <目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言
    • <目标类型的值> := <表达式>.( 目标类型 )  //非安全类型断言
  • 类型断言的本质,跟类型转换类似,都是类型之间进行转换,不同之处在于,类型断言实在接口之间进行。
  • 在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:所有的都要打印,因为已经是最下面一层了,产生错误

分享: