关于小工具代码的补充
调用示例 还是 放在第三篇吧
下面是 reflectoper.GetStructMsg()
package reflectoper
import (
"errors"
"reflect"
"strconv"
"strings"
)
type ModeObj struct {
Field string //多个字段字符串,以,分隔
StructName string //结构名称、
ValueStrs string //多个值的字符串,以,分隔
}
//获取结构多个字段字符串,以, 分隔,以及返回结构名称
func GetStructMsg(value interface{}) (modeobj ModeObj, err error) {
t := reflect.TypeOf(value)
v := reflect.ValueOf(value)
if t.NumField() == 0 {
return modeobj, errors.New(" you struct Field length not nil")
}
//写入字段
var bf strings.Builder
//写入值
var bfv strings.Builder
for i := 0; i < t.NumField(); i++ {
// strings.Join([]string{t.Field(i).Name} ,",")
bf.WriteString(t.Field(i).Name)
bf.WriteString(",")
c := v.Field(i)
//获取值
if c.Kind() != reflect.Invalid {
switch c.Kind() {
case reflect.String:
bfv.WriteString(`"`)
bfv.WriteString(c.String())
bfv.WriteString(`"`)
case reflect.Int:
bfv.WriteString(strconv.FormatInt(c.Int(), 10))
case reflect.Float32:
fl32 := strconv.FormatFloat(c.Float(), 'f', -1, 32)
bfv.WriteString(fl32)
case reflect.Float64:
fl64 := strconv.FormatFloat(c.Float(), 'f', -1, 64)
bfv.WriteString(fl64)
}
bfv.WriteString(",")
}
}
bs := bf.String()
modeobj.Field = bs[0 : len(bs)-1]
modeobj.StructName = t.Name()
bs = bfv.String()
modeobj.ValueStrs = bs[0 : len(bs)-1]
return modeobj, nil
}
下面是 otheroper.ErrorMsg的代码
写这个代码 主要是不想看到满屏的 if err!=nil{} 以及goland 报错 看着烦
package otheroper
import (
"fmt"
"path/filepath"
"runtime"
)
//depth o 为 当前ErrorMsg ,2为错误产生的函数
func ErrorMsg(err error,depth int,msg string)bool {
if err != nil {
caller(depth,err.Error()+";"+msg)
return false
}
return true
}
//Caller报告当前go程调用栈所执行的函数的文件和行号信息。实参skip为上溯的栈帧数,0表示Caller的调用者
func caller(depth int,msg string) {
_,file,line,ok:=runtime.Caller(depth)
if !ok {
msg= "暂未获取到函数信息"
}else {
msg= fmt.Sprintf("当前方法在 %v 文件中,在 %v 行中. \n错误信息为: 【%v】 \n",filepath.Base(file),line,msg)
}
fmt.Printf(msg)
}
下面是 convertoper.SliceToStringByintefce() 的代码
package convertoper
import (
"encoding/binary"
"reflect"
"unsafe"
)
//byte数组转 int32
func BytesToInt32(buf []byte) int32 {
return int32(binary.BigEndian.Uint32(buf))
}
//byte数组转 int64
func BytesToInt64(buf []byte) int64 {
return int64(binary.BigEndian.Uint64(buf))
}
//https://www.cnblogs.com/ghost240/p/3739785.html
//string 转换成byte[]
func StringTobytes(s string) []byte {
x := (*[2]uintptr)(unsafe.Pointer(&s))
h := [3]uintptr{x[0], x[1], x[1]}
return *(*[]byte)(unsafe.Pointer(&h))
}
func SliceToString(b []byte) (s string) {
pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b))
pstring := (*reflect.StringHeader)(unsafe.Pointer(&s))
pstring.Data = pbytes.Data
pstring.Len = pbytes.Len
return
}
//利用反射来转切片为string
func SliceToStringByintefce(v interface{}) (s string) {
/*
if reflect.TypeOf(v).Kind()!=reflect.Slice {
otheroper.ErrorMsg(errors.New("当前类型不是Slice"),2,"")
return
}
*/
return string(reflect.ValueOf(v).Bytes())
}
//https://www.cnblogs.com/Detector/p/9686443.html
// 字符首字母大写
func FirstUpper(str string) string {
var upperStr string
vv := []rune(str) // 后文有介绍
for i := 0; i < len(vv); i++ {
if i == 0 {
if vv[i] >= 97 && vv[i] <= 122 { // 后文有介绍
vv[i] -= 32 // string的码表相差32位
upperStr += string(vv[i])
} else {
//fmt.Println("Not begins with lowercase letter,")
return str
}
} else {
upperStr += string(vv[i])
}
}
return upperStr
}