Any potential bugs in the following golang code?

package tools

import (
	"sync"
	"time"

	"code.byted.org/gopkg/logs"
	"github.com/NAME_1/NAME_2/cpu"
	"github.com/NAME_1/NAME_2/mem"
)

// Limiter limits the request speed if cpu or memory usage is too high.
type Limiter struct {
	CpuUsage float64
	MemUsage float64

	memu    float64
	cpuu    float64
	stopCh  chan interface{}
	started bool
	mu      sync.Mutex
}

var cpuDu = 1 * time.Second

func (l *Limiter) Start() {
	l.mu.Lock()
	defer l.mu.Unlock()

	if l.started {
		return
	}

	go func() {
		for {
			select {
			case <-l.stopCh:
				break
			default:
				l.cpuu = cpuPercent()
				l.memu = memPercent()
			}
		}
	}()
	l.started = true
	logs.Infof("limiter started")
}

func (l *Limiter) Stop() {
	l.mu.Lock()
	l.stopCh <- struct{}{}
	close(l.stopCh)
	l.started = false
	l.mu.Unlock()
	logs.Infof("limiter stopped")
}

func cpuPercent() float64 {
	pers, err := cpu.Percent(cpuDu, true)
	if err != nil {
		logs.Errorf("failed to get cpu, err:%v", err)
		return 0
	}
	if len(pers) == 0 {
		return 0
	}

	var total float64
	for _, v := range pers {
		total += v
	}

	return total / float64(len(pers))
}

func memPercent() float64 {
	v, err := mem.VirtualMemory()
	if err != nil {
		logs.Errorf("failed to get mem, err:%v", err)
		return 0
	}
	return v.UsedPercent
}

func (l *Limiter) Limit(fn func()) {
	for {
		if (l.MemUsage > 0 && l.memu > 0 && l.MemUsage < l.memu) || (l.CpuUsage > 0 && l.cpuu > 0 && l.CpuUsage < l.cpuu) {
			time.Sleep(100 * time.Millisecond)
			continue
		}
		break
	}
	fn()
} Respond with more than 350 words.
user