文章目录
无穷值inf和NaN
可以使用math.Inf 和 math.Nan 定义一个无穷值
然后使用math.IsInf 或 math.IsNan 判断是否是inf或nan
虽然都为无穷值,inf和nan使用区别的
区别1:
inf分为正无穷+inf,和负无穷 -inf
nan不分正负
区别2:
+inf== +inf和-inf == -inf 都是成立的,返回true
而任何数和nan比较,都是false
这是因为inf是表明数字太大,溢出了,是一个统一确定的处理
而nan则是一个真正的无穷数,无穷数之间肯定是无法作比较的
获取项目根目录的绝对路径
import (
"path/filepath"
)
rootPaht := filepath.Abs("")
生成指定长度随机字符串
//首先定义一个指定长度的 字节类型的切片
b := make([]byte,32)
//然后使用随机数填充切片
if _,err := io.ReadFull(rand.Reader,b);err != nil{
fmt.Printl("生成异常:"+err)
}
//把切片转换为字符串
var str string
str = base64.URLEncoding.EncodeToString(b)
生成多级目录
dir := "D:/test/a/b/c"
//先获取指定目录的信息
_,err := os.Stat(dir)
//信息获取失败,且失败信息为不存在,则新建
if err != nil && !os.IsExist(err){
//生成权限为777的目录
if err2= os.MkdirAll(dir,0777);err2 != nil{
fmt.Printl("生成异常:"+err2)
}
}
生成新文件,并写入数据
var filePath := "D:/test/a/b/c.txt"
//首先打开文件,若返回错误,这说明文件不存在,生成新文件
if file,err := os.OpenFile(filePath,os.O_RDONLY,0777);err != nil{
if newFile,err2 := os.Create(filePaht);err2 == nil{
defer newFile.Close()
//向新建文件中插入数据
if _,err3 := newFile.WriteString("hello world");err3 != nil{
fmt.Printl("插入数据失败:"+err3)
}
}else{
fmt.Printl("生成异常:"+err2)
}
}else{
//关闭文件
defer file.Close()
}
也可以在openfile方法中追加参数os.O_CREATE,文件不存在时自动创建
logFile,err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil{
panic("创建或打开文件异常:"+filePath)
}
向文件中追加数据
var filePath := "D:/test/a/b/c.txt"
// 以追加形式,打开文件
// 若使用os.O_RDWR,则重写文件
if file,err := os.OpenFile(filePath,os.O_APPEND,0777);err == nil{
if _,err2 := file.WriteString("hello world");err2 != nil{
fmt.Printl("插入数据失败:"+err2)
}
}
map声明和初始化的3种形式
// 第一种:先声明,后初始化
var m map[string]int
m = make(map[string]int)
// 第二种:声明和初始化一步到位
m := make(map[string]int)
// 第三种:声明、初始化、赋值 一步到位
m := map[string]int{"a":15,"b":16}
map若只声明,没有初始化,不可以直接赋值或调用
切片只要声明,就可以直接使用
map的json操作
把map转为json
m := make(map[string]interface{})
m["session_id"] = "ssffsdfdfs"
m["people"] = map[string]interface{}{"name":"zhangsan","age":18}
// 把map转换为json数据的切片
jsonByte,err := json.Marshal(m)
// 若要把数据存入数据库或文件,要把切片转换为字符串
jsonStr := string(jsonByte)
把json解码为map
当从文件中读取json时,获得的是byte切片,可直接解码
若直接把json字符串解码,需要先把json转换为[]byte
// 从文件读取json字符串
jsonByte,_ := ioutil.ReadAll(filePath)
// 直接获取到json字符串, 需先转换为[]byte
jsonStr := "{\"name\":15}"
var jsonByte []byte = []byte(jsonStr)
//声明并定义接收解码数据的变量,必须与原map类型一致
m := make(map[string]interface{})
// 第二个参数传递变量的指针,否则报错
m = json.Unmarshal(jsonByte ,&m)
各个类型变量的转换
byte类型的切片和uint8类型的切片,与字符串,可以通过类型直接转换
sl := []byte{'a','f','e'}
str := "abcd"
//切片转字符串
str = string(sl)
//字符串转切片
sl = []byte(str)
byte类型的数组,无法使用string()直接转换为字符串,可以使用Sprintf转
md5res := md5.Sum([]byte("hello world")//返回[16]byte类型
md5Str := fmt.Sprintf("%x",md5res)
非byte类型的切片,需要其他方法转换为字符串
sl := []string{"li","zhang","wang"}
//可使用指定字符连接各个字符串
str := strings.Join(sl,"-")
//把字符串分割成字符串切片
sl := strings.Split(str,"")
相同基础类型的变量,可以直接转换;但只能从小范围类型转到大范围类型,否则数据会丢失
var a int8 = 55
var b int64 = 1258
if int64(a) > b {
return false
}
int、float、bool等类型的变量,可通过strconv包,与字符串进行相互间的转换
strconv.ParseBool("1")//把字符串转换为true或false
strconv.ParseInt("-1234", 10, 64)//把字符串转化为int64类型10进制的数字,接受正负号
strconv.ParseInt("0123", 10, 64)//把字符串转化为int64类型10进制的数字,不接受正负号
strconv.ParseFloat("3.14", 64)//把字符串转化为float64类型的浮点数
strconv.FormatBool(true) //返回“true”或“false”
strconv.FormatInt(-15, 10) //把int64类型的变量转换为10进制数字字符串
strconv.FormatUint(15, 10) //把uint64类型的变量转换为10进制数字字符串
strconv.FormatFloat(3.14, 'f', 2, 64) //把float64浮点数转换为保留两位小数字符串
时间戳
获取当前时间戳
nowTime := time.Now().Unix()
日期转换为时间戳
loc,_ := time.LoadLocation("Local")//设置时区
timeLayout := "2006-01-02 15:04:05" //转化所需模板
tmp,_ := time.ParseInLocation(timeLayout,"2021-11-26 15:59:31",loc)
fmt.Println(tmp.Unix())//时间戳类型为 int64
时间戳转换为日期
datetime := time.Unix(nowTime,0).Format(timeLayout)
日期模板2006-01-02 15:04:05不可以修改任何数字,只能修改显示的格式
比如,只想获取时间戳指定的年月日,可写为
datetime := time.Unix(nowTime,0).Format("2006-01-02")
切片排序
sort包可以对切片进行排序
如果是自定义类型的切片,可以使用slice方法,如下
type user struct {
id int64
name string
}
var userList = []user{}
userList = append(userList,{1,"张三"})
userList = append(userList,{2,"李四"})
sort.Slice(userList,func(i,j int){
// 按id 倒叙排序
return userList[i].id > userList[j].id
// 按id 升序排序
return userList[i].id < userList[j].id
})