diff --git a/.golangci.yml b/.golangci.yml index ef0ea27a94..3db79fcc93 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,6 +1,6 @@ version: "2" run: - go: "1.24" + go: "1.25" linters: default: none enable: diff --git a/Dockerfile b/Dockerfile index 93164c2d32..416e0ff0f3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,7 +20,7 @@ RUN make ui # STEP 2 build executable binary -FROM --platform=$BUILDPLATFORM golang:1.24-alpine AS builder +FROM --platform=$BUILDPLATFORM golang:1.25-alpine AS builder # Install git + SSL ca certificates. # Git is required for fetching the dependencies. diff --git a/cmd/detect/work.go b/cmd/detect/work.go index e5e65dc7e9..0653180e9a 100644 --- a/cmd/detect/work.go +++ b/cmd/detect/work.go @@ -11,26 +11,21 @@ import ( "github.com/jeremywohl/flatten" ) -func workers(log *util.Logger, num int, tasks <-chan string, hits chan<- []tasks.Result) *sync.WaitGroup { +func workers(log *util.Logger, num int, ips <-chan string, hits chan<- []tasks.Result) *sync.WaitGroup { var wg sync.WaitGroup + for range num { - wg.Add(1) - go func() { - workunit(log, tasks, hits) - wg.Done() - }() + wg.Go(func() { + for ip := range ips { + res := taskList.Test(log, "", tasks.ResultDetails{IP: ip}) + hits <- res + } + }) } return &wg } -func workunit(log *util.Logger, ips <-chan string, hits chan<- []tasks.Result) { - for ip := range ips { - res := taskList.Test(log, "", tasks.ResultDetails{IP: ip}) - hits <- res - } -} - func Work(log *util.Logger, num int, hosts []string) []tasks.Result { ip := make(chan string) hits := make(chan []tasks.Result) diff --git a/cmd/shutdown/shutdown.go b/cmd/shutdown/shutdown.go index 44974a8c83..f58cdee5e2 100644 --- a/cmd/shutdown/shutdown.go +++ b/cmd/shutdown/shutdown.go @@ -18,16 +18,11 @@ func Register(cb func()) { // Cleanup executes the registered shutdown functions when the stop channel closes func Cleanup(doneC chan struct{}) { - wg := new(sync.WaitGroup) + var wg sync.WaitGroup mu.Lock() for _, cb := range handlers { - wg.Add(1) - - go func(cb func()) { - cb() - wg.Done() - }(cb) + wg.Go(cb) } mu.Unlock() diff --git a/cmd/token_tronity.go b/cmd/token_tronity.go index 6f1f9f840f..a55b660488 100644 --- a/cmd/token_tronity.go +++ b/cmd/token_tronity.go @@ -64,20 +64,18 @@ func tronityAuthorize(addr string, oc *oauth2.Config) (*oauth2.Token, error) { mux := &http.ServeMux{} mux.HandleFunc("/auth/tronity", handler) - wg := new(sync.WaitGroup) s := &http.Server{ Addr: addr, Handler: mux, } // start server - wg.Add(1) - go func() { + var wg sync.WaitGroup + wg.Go(func() { if err := s.ListenAndServe(); err != http.ErrServerClosed { log.FATAL.Fatal(err) } - wg.Done() - }() + }) // close on exit defer func() { diff --git a/core/site.go b/core/site.go index 81c639d635..5535029b7f 100644 --- a/core/site.go +++ b/core/site.go @@ -483,7 +483,6 @@ func (site *Site) publish(key string, val interface{}) { } func (site *Site) collectMeters(key string, meters []config.Device[api.Meter]) []measurement { - var wg sync.WaitGroup mm := make([]measurement, len(meters)) fun := func(i int, dev config.Device[api.Meter]) { @@ -525,13 +524,14 @@ func (site *Site) collectMeters(key string, meters []config.Device[api.Meter]) [ Power: power, Energy: energy, } - - wg.Done() } - wg.Add(len(meters)) + var wg sync.WaitGroup + for i, meter := range meters { - go fun(i, meter) + wg.Go(func() { + fun(i, meter) + }) } wg.Wait() @@ -885,18 +885,15 @@ func (site *Site) updateLoadpoints(rates api.Rates) float64 { sum float64 ) - wg.Add(len(site.loadpoints)) for _, lp := range site.loadpoints { - go func() { + wg.Go(func() { power := lp.UpdateChargePowerAndCurrents() site.prioritizer.UpdateChargePowerFlexibility(lp, rates) mu.Lock() sum += power mu.Unlock() - - wg.Done() - }() + }) } wg.Wait() diff --git a/go.mod b/go.mod index ad6f43210a..53452af890 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/evcc-io/evcc -go 1.24.0 +go 1.25.0 require ( dario.cat/mergo v1.0.2 diff --git a/server/modbus/proxy_test.go b/server/modbus/proxy_test.go index 4947c56311..3c298de3ac 100644 --- a/server/modbus/proxy_test.go +++ b/server/modbus/proxy_test.go @@ -30,10 +30,8 @@ func TestConcurrentRead(t *testing.T) { var wg sync.WaitGroup - for i := 1; i <= 10; i++ { - wg.Add(1) - - go func(id int) { + for id := 1; id <= 10; id++ { + wg.Go(func() { // client conn, err := modbus.NewConnection(context.TODO(), l.Addr().String(), "", "", 0, modbus.Tcp, uint8(id)) require.NoError(t, err) @@ -53,9 +51,7 @@ func TestConcurrentRead(t *testing.T) { time.Sleep(time.Duration(rand.Int31n(1000)) * time.Microsecond) } - - wg.Done() - }(i) + }) } wg.Wait()