@ -173,3 +173,82 @@ func GeneratorUmlaufListe(start, ende, einsprung int) (umlaufliste []int) {
}
return
}
#
// Contains tells whether a contains x.
func SliceContainsString ( haystack [ ] string , needle string ) int {
for i , v := range haystack {
if needle == v {
return i
}
}
return - 1
}
// 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
}
// Dank an https://programming.guide/go/formatting-byte-size-to-human-readable-format.html
func ByteCountDecimal ( b int64 ) string {
const unit = 1024
if b < unit {
return fmt . Sprintf ( "%d B" , b )
}
div , exp := int64 ( unit ) , 0
for n := b / unit ; n >= unit ; n /= unit {
div *= unit
exp ++
}
return fmt . Sprintf ( "%.1f %cB" , float64 ( b ) / float64 ( div ) , "kMGTPE" [ exp ] )
}
func ByteCountBinary ( b int64 ) string {
const unit = 1024
if b < unit {
return fmt . Sprintf ( "%d B" , b )
}
div , exp := int64 ( unit ) , 0
for n := b / unit ; n >= unit ; n /= unit {
div *= unit
exp ++
}
return fmt . Sprintf ( "%.1f %ciB" , float64 ( b ) / float64 ( div ) , "KMGTPE" [ exp ] )
}
/ *
// grazeStatusChannel liest einen Wert aus dem StatusChannel, setzt, löscht oder liest ihn. Danach wird der Channel wieder neu geschrieben, damit alle anderen Jobs, die am Channel lauschen, nicht ins Stocken geraten.
func grazeStatusChannel ( sc * chan config . SPStype , mode string , offset uint ) bool {
cvalue , cstatus := <- * sc
if cstatus {
switch strings . ToLower ( mode ) {
case "set" :
* sc <- uint8 ( wrap7 . SetBit ( int ( cvalue ) , offset ) )
return true // Eigentlich wurscht, was ich hier zurückgebe, aber im Zweifel "true" = gesetzt
case "clear" :
* sc <- uint8 ( wrap7 . ClearBit ( int ( cvalue ) , offset ) )
return false // Eigentlich wurscht, was ich hier zurückgebe, aber im Zweifel "false" = nicht gesetzt
default : //case "has":
* sc <- cvalue
return wrap7 . HasBit ( int ( cvalue ) , offset )
}
} else {
_ , fn , line , _ := runtime . Caller ( 2 )
fmt . Printf ( "Kein statusChannel? Eigentlich hätte der Programmzeiger niemals hier sein dürfen. %s:%d\n" , fn , line )
return false //FIXME: Evtl. wäre hier eine panic zu setzen
}
}
* /