请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

singleflight结果和预想不一样

go version

go version go1.22.5 darwin/amd64

go.mod

module test

go 1.22.5

require golang.org/x/sync v0.7.0 // indirect

代码如下:

package main

import (
	"fmt"
	"sync"
	"sync/atomic"

	"golang.org/x/sync/singleflight"
)

var n = int32(0)

var singleFlightGetArticle singleflight.Group

func cache(id int) int32 {
	//fmt.Println("get by cache:", id)
	return atomic.LoadInt32(&n)
}

func db(id int) int32 {
	fmt.Println("get by db:", id)
	return 168
}

func get(id int, key string) int32 {
	_n := cache(id)
	if _n == 0 {
		val, _, _ := singleFlightGetArticle.Do(key, func() (interface{}, error) {
			return db(id), nil
		})
		_n = val.(int32)
		atomic.StoreInt32(&n, _n)
	}
	return _n
}

func main() {
	wg := sync.WaitGroup{}
	key := "demo"

	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			get(i, key)
		}()
	}

	wg.Wait()
	fmt.Println("---------------------------")
}

执行结果如下:
图片描述

正在回答 回答被采纳积分+3

1回答

少林码僧 2024-07-24 15:26:47
我用相同的go版本在win10上执行没问题。你试试将代码拷贝到另一个目录然后在命令行终端通过go run执行试试,有可能运行的是之前改动过程中的旧版本编译后的代码
0 回复 有任何疑惑可以回复我~
  • 提问者 初级小码农 #1
    重新拷贝到新文件夹,然后在终端通过 go run main.go 运行,结果还是一样
    回复 有任何疑惑可以回复我~ 2024-07-24 16:36:06
  • 提问者 初级小码农 #2
    我把代码复制到ubuntu上运行,结果还是一样
    回复 有任何疑惑可以回复我~ 2024-07-24 16:41:48
  • 少林码僧 回复 提问者 初级小码农 #3
    我在ubuntun上运行也是没问题的,你运行下这个代码看看https://github.com/phper95/singleflight-demo
    回复 有任何疑惑可以回复我~ 2024-07-26 11:32:47
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信