dbhelper 2 补充说明

本文深入探讨了Go语言中的三个实用工具包:reflectoper、otheroper和convertoper。reflectoper包提供了获取结构体信息的功能,如字段名和值;otheroper包简化了错误处理流程,使代码更整洁;convertoper包则专注于数据类型的转换,如byte数组与int、string之间的转换。这些工具包旨在提高代码的可读性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于小工具代码的补充

调用示例 还是 放在第三篇吧
下面是 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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值