员工ID生成器定义了一个函数,EmployeeIdGenerator
main函数先执行,定义了变量generator 属于 EmployeeIdGenerator的函数类型
并给变量 generator进行赋值
赋值过程中启动了 appendSn 函数,这个函数最终反回了一个 string,并把这个string赋值给了generator
最后打印时,执行了generateId这个函数,像函数内传递两个变量
这时,generateId这个函数接收到并在自己函数内部使用的变量【generator EmployeeIdGenerator】
要怎么去理解?他接收到的值是个应该是个函数,但在这个函数内部的使用有点没看懂。请老师给讲解一下好吗
个人理解:我觉得是main函数里,首先声明"generator"变量,再给"generator"变量赋值,最后将"generator"作为"generateId"函数的形参传入了函数里去执行相关逻辑
我说下我的理解,我是个菜鸡,所说的仅是我个人理解,不一定对,讲出来也不是为了误导各位,只是给个想法,其他同学也多个考虑的方向;
package main
import (
"fmt"
"strconv"
"sync/atomic"
)
type EmployeeIdGenerator func(company string, department string, sn uint32) string
var company = "Gophers"
var sn uint32
func generateId(generator EmployeeIdGenerator, department2 string) (string, bool) {
//这里修改变量department为department2,会好理解一点
if generator == nil {
return "", false
newSn := atomic.AddUint32(&sn, 1)
return generator(company, department2, newSn), true
}
func appendSn(firstPart string, sn uint32) string {
return firstPart + strconv.FormatUint(uint64(sn), 10)
}
func main() {
var generator EmployeeIdGenerator
generator = func(company string, department string, sn uint32) string {
return appendSn(company+"-"+department+"-", sn)
}
fmt.Println(generateId(generator, "RD"))
}
从main函数看,先执行generateId函数,返回值为 generator("Gophers", "RD", 1), true
generator 再执行重写的方法 返回值为 appendSn("Gophers"+"-"+"RD"+"-", 1)
最终结果为 Gophers-RD-1 true