初级会员
  • 第 42743 位会员
  • guoapeng
  • 2019-09-11 16:19:45
  • Offline
  • 22 85

最近发布的主题

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • 1楼 @gojuukaze 如下方式可以取到返回值 ```go func ExampleGetValueFromFunc2() { r := divide(8, 4) fmt.Println("8/4 =", r) //Output: // 8/4 = 2 } func divide(x, y int) (z int) { Try{func(a, b int) { z = a / b return }}.Catch(func(ex error) { fmt.Println("error happens", ex) }).Go(x, y) return } ```
  • 1楼 @gojuukaze 可以的,不过需要这样写, 只是 从try-catch语句获得值的就比较古怪了,其实写这个包的主要目的是将正常逻辑和异常逻辑进行分离,正常业务处理逻辑写在 try中,异常处理写到集中写到catch中,处理不了的使用panic继续向上抛,在最外层统一处理。 ```go func ExampleGetValueFromFunc() { fn := Try{ func(a, b int) int { return a/b }}.Catch(func (ex error){ fmt.Println("error happens", ex) }) r := fn.Go(8, 8) fmt.Printf("8/8 = %v\n", r[0].Interface()) r = fn.Go(8, 0) // error happened, r = nil // Output: // 8/8 = 1 // error happens runtime error: integer divide by zero } ```
  • 不是同一个锁,这就是传值和传引用的差别("pass by value" vs "pass by reference") 将两个锁的地址打印出来比较你会发现,不指向同一个对象 ```go func f4() { m := make(map[string]int) var lock sync.RWMutex go func(m map[string]int, l sync.RWMutex) { for { time.Sleep(time.Second * 1) fmt.Printf("lock B is %p :\n ", &l) l.RLock() fmt.Println("token now is : ", m["a"]) l.RUnlock() } }(m, lock) for { time.Sleep(time.Second * 1) fmt.Printf("lock A is %p :\n ", &lock) lock.Lock() m["a"] = rand.Int() lock.Unlock() } } ``` output ```shell lock A is 0xc0000123c0 : lock B is 0xc000090000 : token now is : 605394647632969758 ```
  • 写得很好,能否做成go module?