• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    BLAMIThe Go Programming Language - moderni programovaci jazyk

    Go is an open source programming environment that makes it easy to build simple, reliable, and efficient software.

    Pro vyhledavani clanku/blogu/informaci o Go v Google je potreba misto vyrazu "Go" pouzivat "Golang".

    Web:
    golang.org - ofic. www stranky projektu Go
    Go Playground - piskoviste na vyzkouseni Go
    blog.golang.org - ofic. blog projektu Go
    pkg.go.dev - vyhledavac knihoven a dokumentace
    Awesome Go - seznam oblibenych projektu, knihoven a blogu

    Literatura:
    The Way To Go: A Thorough Introduction To The Go Programming Language (Ivo Balbaert)
    Programming in Go: Creating Applications for the 21st Century (Developer's Library) (Mark Summerfield)

    Komunita:
    Slack Gophers - server pro uzivatele a skupiny okolo projektu v Go
    rozbalit záhlaví
    CUCHULAIN
    CUCHULAIN --- ---
    RAGNAROK: jinak testovat typ parametru můžeš - https://golang.org/ref/spec#Type_assertions
    CUCHULAIN
    CUCHULAIN --- ---
    RAGNAROK: a určitě to potřebuješ zrovna takhle?
    bylo by potřeba trochu experimentovat, ale určitě to není ideální řešení. např. tím úplně obejdeš typovou kontrolu, která se při vývoji dost hodí :-)
    RAGNAROK
    RAGNAROK --- ---
    CUCHULAIN:
    No ja bych pro priklad chtel aby kdyz zadam:
    a) F(g()) - aby to vracelo furt stejnej cas tj. vyhodnoti se funckce g jednou a pak F pouziva dokoloa tu hodnotu
    b) F(g) - aby funkce vzdycky vyhodnotila funkci g. Tj. melo by to vracet aktualni cas.
    c) F() - aby to nevracelo nic. resp. nejakou default hodnotu.
    CUCHULAIN
    CUCHULAIN --- ---
    CUCHULAIN: teď teda nevím, jestli je to odpověď na otázku, ale alespoň to vrací čas :-)
    RAGNAROK
    RAGNAROK --- ---
    Potreboval bych definovat funkci F ktera jako vstupni parameter bere funkci "g() interface{}", interface{} nebo nic. Jde to nejak?
    Zkousim:
    a) https://play.golang.org/p/cISsisyUORU
    F(g()) - tohle pise porad stejny cas, nebere nic

    b) https://play.golang.org/p/V3k-z4WNax1
    F(g) - tohle vraci adresu pameti, nebere nic

    c) https://play.golang.org/p/4JXlRY47_6k
    tohle bere nic nebo interface
    CUCHULAIN
    CUCHULAIN --- ---
    RAGNAROK: tak dobrý :-)
    pokud to nepotřebuješ zaokrouhlit na nějaký extrémně vysoký počet des. míst, mělo by to stačit.
    RAGNAROK
    RAGNAROK --- ---
    CUCHULAIN:
    To je divne, dekuji za vyzkouseni. Me to meri tak ze ta tvoje funkce trva ~80 ns a ta moje ~1000 ns.
    CUCHULAIN
    CUCHULAIN --- ---
    RAGNAROK: mě to teda nic moc neměří :-)

    go run RoundBenchmark.go
    2.828356449679806e+19 6 2.828356449679806e+19
    2.828356449679806e+19 6 2.828356449679806e+19
    
    Rounder times: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    Rounder mean time: 0
    
    Rounderp times: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    Rounderp mean time: 0
    
    RAGNAROK
    RAGNAROK --- ---
    RAGNAROK:
    Zajimalo by me jestli funkce Measurer pujde prepsat tak ze by brala obecnou funkci.
    RAGNAROK
    RAGNAROK --- ---
    CUCHULAIN:
    
    package main
    
    import (
    	"fmt"
    	"math"
    	"math/rand"
    	"strconv"
    	"time"
    
    	"gonum.org/v1/gonum/stat"
    )
    
    func main() {
    	rand.Seed(time.Now().Unix())
    	flt := rand.Float64() * 1e20
    	rand.Seed(time.Now().Unix())
    	flt = flt + rand.Float64()*1e10
    	rand.Seed(time.Now().Unix())
    	flt = flt + rand.Float64()
    
    	plc := rand.Intn(9)
    	num := 100
    
    	fmt.Println(flt, plc, Rounder(flt, plc))
    	fmt.Println(flt, plc, Rounderp(flt, plc))
    	fmt.Println()
    
    	fn1 := Measurer(num, Rounder, flt, plc)
    	fmt.Println("Rounder times:", fn1)
    	fmt.Println("Rounder mean time:", stat.Mean(fn1, nil))
    
    	fmt.Println()
    	fn2 := Measurer(num, Rounderp, flt, plc)
    	fmt.Println("Rounderp times:", fn2)
    	fmt.Println("Rounderp mean time:", stat.Mean(fn2, nil))
    
    }
    
    func Measurer(num int, fn func(par float64, places int) float64, p1 float64, plc int) []float64 {
    	var ott []float64
    	for i := 0; i < num; i++ {
    		t0 := time.Now()
    		fn(p1, plc)
    		t1 := float64(time.Since(t0))
    		ott = append(ott, t1)
    	}
    	return ott
    }
    
    func Rounder(i float64, places int) float64 {
    	frmt := "%." + fmt.Sprint(places) + "f"
    	a, _ := strconv.ParseFloat(fmt.Sprintf(frmt, i), 64)
    	return a
    }
    
    func Rounderp(i float64, places int) float64 {
    	pow := math.Pow10(places)
    	num := math.Round(i*pow) / pow
    	return num
    }
    


    Ten tvuj zpusob je 20x rychlejsi dle horejsiho testu. :)
    CUCHULAIN
    CUCHULAIN --- ---
    RAGNAROK: ok. je možný, že fmt zaokrouhluje. to jsem nezkoušel.
    RAGNAROK
    RAGNAROK --- ---
    CUCHULAIN:
    Jsem tu funkci testoval a zaokrouhluje podle pravidel.
    Stim pow muze byt pro velke cisla problem preteceni.
    CUCHULAIN
    CUCHULAIN --- ---
    RAGNAROK: takže třeba takhle:

    package main
    
    import (
    	"fmt"
    	"math"
    )
    
    func main() {
    	for i := 0; i < 10; i++ {
    		pow := math.Pow10(i)
    		num := math.Round(9.123456789 * pow) / pow
    		fmt.Println(num)
    	}
    }
    CUCHULAIN
    CUCHULAIN --- ---
    CUCHULAIN: teda... místo 3 má být places
    CUCHULAIN
    CUCHULAIN --- ---
    RAGNAROK: tohle nemáš úplně zaokrouhlování, spíš Floor.

    pow := math.Pow10(3)
    a := math.Round(i * pow) / pow
    
    RAGNAROK
    RAGNAROK --- ---
    Neni neco lepsiho pro zaokrouhlovani na pozadovany misto? Jsem uklohnil tohle:
    
    func Rounder(i float64, places int) (float64, error) {
    	frmt := "%." + fmt.Sprint(places) + "f"
    	a, err := strconv.ParseFloat(fmt.Sprintf(frmt, i), 64)
    	return a, err
    }
    


    BULHI
    BULHI --- ---
    CUCHULAIN
    CUCHULAIN --- ---
    ANT_39: správně. akorát bych nechtěl potkat projekťáka, který mi tohle navrhne :-)
    ANT_39
    ANT_39 --- ---
    NYX: Podle toho, co znamena "na zaklade vstupnich parametru". Pokud to ma pro sudy cisla vracet int64 a pro lichy float64, tak ti generika nepomuzou, a vracet Interface je v zasade to ciste reseni.
    CUCHULAIN
    CUCHULAIN --- ---
    NYX: jasně, debat ohledně vyspělosti Go je hromada, každopádně interface funguje :-)
    NYX
    NYX --- ---
    RAGNAROK: Zadne ciste reseni. Reflexe, interface + runtime aserce nebo generovany kod jsou jen zpusoby jak ocurat absenci generik.
    Kliknutím sem můžete změnit nastavení reklam