Some tools, I frequently use.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

175 lines
4.0 KiB

package ebkTools
import (
"bytes"
"math"
"path"
"reflect"
"regexp"
"runtime"
"strconv"
"strings"
)
//Round rundet Zahlen
func Round(number float64, digits int8) float64 {
pow := math.Pow(10, float64(digits))
return math.Floor(number*pow+.5) / pow
}
//Concatstring verbindet zwei Strings mit größerer Performance als "+", prozeduales Verfahren
func Concatstring(args ...string) string {
var buffer bytes.Buffer
for _, v := range args {
buffer.WriteString(v)
}
return buffer.String()
}
//Join verbindet zwei Strings mit größerer Performance als "+", OOP-Verfahren
func (f *Concatablestring) Join(args ...string) string {
var buffer bytes.Buffer
buffer.WriteString(string(*f))
for _, v := range args {
buffer.WriteString(v)
}
return buffer.String()
}
//Concatablestring ist das Mutter-Objekt für die Join-Methode
type Concatablestring string
//String2args macht aus einem String ein Array, trennt am Trennzeichen, berücksichtigt aber mit einfachen und doppelten Anführungszeichen eingegrenzte Bereiche
func String2args(s string) (ss []string) {
s = regexp.MustCompile(`([\s\p{Zs}]{1,})|('[^']*')|(\"[^\"]*\")`).ReplaceAllString(s, "${0}💇") // Leerzeichen innerhalb von Anführungszeichen sollen nicht ersetzt werden!
s = regexp.MustCompile(`[\s\p{Zs}💇]{1,}💇`).ReplaceAllString(s, "💇") // Entferne alle Leerzeichen VOR dem 💇; auch doppelte 💇 sollen verschwinden.
s = strings.Trim(s, "💇")
ss = strings.Split(s, "💇") // Bereinige die Stringränder, insbesondere das Ende
for i := 0; i < len(ss); i++ { // Entferne die Anführungszeichen
ss[i] = strings.Trim(ss[i], `"'`)
//fmt.Println(ss[i])
}
//fmt.Println(ss)
return // übertrage den Input in ein Array
}
/*
package main
import (
. "ebkTools/schtrings"
"fmt"
)
func main() {
fmt.Println(Concatstring("a", "b", "c"))
teststring := (Concatablestring)("Anfangswert ")
fmt.Println(Join("gefolgt ", "von ", "meinem ", "Text"))
}
*/
// Funktionen um einzelne Bits innerhalb eines 8-Byte-Blockes (wenn int = int64) zum manipulieren oder abzufragen
// SetBit setzt das Bit an Position pos im int-Variable n.
func SetBit(n int, pos uint) int {
n |= (1 << pos)
return n
}
// ClearBit löscht das Bit an Position pos im int-Variable n.
func ClearBit(n int, pos uint) int {
mask := ^(1 << pos)
n &= mask
return n
}
//HasBit prüft, ob das Bit an Position pos gesetzt ist
func HasBit(n int, pos uint) bool {
val := n & (1 << pos)
return (val > 0)
}
//CodeCaller liefert die Datei und Codezeile der aufrufenden Datei als String zurück
func CodeCaller() string {
_, file, line, _ := runtime.Caller(1) // 1, nicht 0; sonst kommt immer Zeile "ebkTools:XX" heraus!
return path.Base(file) + ":" + strconv.Itoa(line)
}
//Ip4or6 prüft, ob der String eine IPv4 oder IPv6 repräsentiert
func Ip4or6(s string) uint8 {
for i := 0; i < len(s); i++ {
switch s[i] {
case '.':
return 4
case ':':
return 6
}
}
return 0
}
func InArray(array interface{}, value interface{}) (exists bool, index int) {
exists = false
index = -1
switch reflect.TypeOf(array).Kind() {
case reflect.Slice:
s := reflect.ValueOf(array)
for i := 0; i < s.Len(); i++ {
if reflect.DeepEqual(value, s.Index(i).Interface()) == true {
index = i
exists = true
return
}
}
}
return
}
// Check error code
func Check(e error) {
if e != nil {
panic(e)
}
}
// Difference of two []string-Slices
// Set Difference: A - B
func StringsDiff(a, b []string) (diff []string) {
m := make(map[string]bool)
for _, item := range b {
m[item] = true
}
for _, item := range a {
if _, ok := m[item]; !ok {
diff = append(diff, item)
}
}
return
}
//Check if sting is inside slice
func StringInSlice(list *[]string, a string) bool {
for _, b := range *list {
if b == a {
return true
}
}
return false
}
func GeneratorUmlaufListe(start, ende, einsprung int) (umlaufliste []int) {
for i := einsprung; i <= ende; i++ {
umlaufliste = append(umlaufliste, i)
}
for i := start; i < einsprung; i++ {
umlaufliste = append(umlaufliste, i)
}
return
}