内容简介:通过一个阶乘函数的不同写法将 Go 程序员进行划分。来自:欢迎关注我的公众号:
通过一个阶乘函数的不同写法将 Go 程序员进行划分。
初级 Go 程序员
package fac func Factorial(n int) int { res := 1 for i := 1; i <= n; i++ { res *= i } return res }
函数式 Go 程序员
package fac func Factorial(n int) int { if n == 0 { return 1 } else { return Factorial(n - 1) * n } }
泛型 Go 程序员
package fac func Factorial(n interface{}) interface{} { v, valid := n.(int) if !valid { return 0 } res := 1 for i := 1; i <= v; i++ { res *= i } return res }
多线程优化的 Go 程序员
package fac import "sync" func Factorial(n int) int { var ( left, right = 1, 1 wg sync.WaitGroup ) wg.Add(2) pivot := n / 2 go func() { for i := 1; i < pivot; i++ { left *= i } wg.Done() }() go func() { for i := pivot; i <= n; i++ { right *= i } wg.Done() }() wg.Wait() return left * right }
发现型 Go 模式
package fac func Factorial(n int) <-chan int { ch := make(chan int) go func() { prev := 1 for i := 1; i <= n; i++ { v := prev * i ch <- v prev = v } close(ch) }() return ch }
使用成熟的解决方案修复 Go 缺陷
package fac /** * @see https://en.wikipedia.org/wiki/Factorial */ type IFactorial interface { CalculateFactorial() int } // FactorialImpl implements IFactorial. var _ IFactorial = (*FactorialImpl)(nil) /** * Used to find factorial of the n. */ type FactorialImpl struct { /** * The n. */ n int } /** * Constructor of the FactorialImpl. * * @param n the n. */ func NewFactorial(n int) *FactorialImpl { return &FactorialImpl{ n: n, } } /** * Gets the n to use in factorial function. * * @return int. */ func (this *FactorialImpl) GetN() int { return this.n } /** * Sets the n to use in factorial function. * * @param n the n. * @return void. */ func (this *FactorialImpl) SetN(n int) { this.n = n } /** * Returns factorial of the n. * * @todo remove "if" statement. Maybe we should use a factory or somthing? * * @return int. */ func (this *FactorialImpl) CalculateFactorial() int { if this.n == 0 { return 1 } n := this.n this.n = this.n - 1 return this.CalculateFactorial() * n }
高级 Go 程序员
package fac // Factorial returns n!. func Factorial(n int) int { res := 1 for i := 1; i <= n; i++ { res *= i } return res }
Rob Pike
package fac // Factorial returns n!. func Factorial(n int) int { res := 1 for i := 1; i <= n; i++ { res *= i } return res }
来自: https://github.com/SuperPaintman/the-evolution-of-a-go-programmer ,启发自《程序员的演变》 https://www.ariel.com.au/jokes/The_Evolution_of_a_Programmer.html
欢迎关注我的公众号:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序算法与技巧精选
郭继展 / 2008-5 / 36.00元
《信息科学与技术丛书•程序算法与技巧精选》分17章,139个例题。书中介绍的算法和技巧涉及到随机数函数理论,基础数论,新意幻方,提高程序运行速度和精度,特定数据排序,穷举、递推、递归和迭代等诸多方面。这些算法和技巧大多是作者历年从事教学、软件开发、学术研究和学习的成果总结。 《信息科学与技术丛书•程序算法与技巧精选》内容不涉及计算机专业课程的诸多概念、理论,读者只需要学过C语言,有算法、结构......一起来看看 《程序算法与技巧精选》 这本书的介绍吧!