go常用方法使用记录

无穷值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
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值