| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 | package grpcutilimport (	"errors"	"reflect"	"kpt-tmr-group/pkg/xerr"	spb "google.golang.org/genproto/googleapis/rpc/status"	"google.golang.org/grpc/codes"	"google.golang.org/grpc/status")// StatusError cause of grpc status errorfunc StatusError(err error) (*status.Status, bool) {	statusErr, ok := status.FromError(xerr.Cause(err))	if !ok {		return nil, false	}	return statusErr, true}// FilterServerError 优化服务端错误上报逻辑func FilterServerError(err error) bool {	statusErr, ok := StatusError(err)	if !ok {		return true	}	details := statusErr.Details()	for _, detail := range details {		if _, ok := detail.(*spb.Status); ok && statusErr.Code() != codes.Canceled {			return false		}	}	ignoreStatus := []codes.Code{codes.InvalidArgument, codes.Unauthenticated, codes.NotFound, codes.FailedPrecondition, codes.AlreadyExists}	if inArray, _ := In(statusErr.Code(), ignoreStatus); inArray {		return false	}	return true}func In(obj interface{}, target interface{}) (bool, error) {	targetValue := reflect.ValueOf(target)	switch reflect.TypeOf(target).Kind() {	case reflect.Slice, reflect.Array:		for i := 0; i < targetValue.Len(); i++ {			if targetValue.Index(i).Interface() == obj {				return true, nil			}		}	case reflect.Map:		if targetValue.MapIndex(reflect.ValueOf(obj)).IsValid() {			return true, nil		}	}	return false, errors.New("not in array")}
 |