问答详情
源自:6-1 Go语言-函数

函数变量的传递过程

员工ID生成器定义了一个函数,EmployeeIdGenerator

main函数先执行,定义了变量generator 属于 EmployeeIdGenerator的函数类型

并给变量 generator进行赋值

赋值过程中启动了 appendSn 函数,这个函数最终反回了一个 string,并把这个string赋值给了generator

最后打印时,执行了generateId这个函数,像函数内传递两个变量

这时,generateId这个函数接收到并在自己函数内部使用的变量【generator EmployeeIdGenerator】

要怎么去理解?他接收到的值是个应该是个函数,但在这个函数内部的使用有点没看懂。请老师给讲解一下好吗

提问者:nitros 2019-11-28 14:40

个回答

  • 慕神Sunday
    2021-01-15 16:14:08

    个人理解:我觉得是main函数里,首先声明"generator"变量,再给"generator"变量赋值,最后将"generator"作为"generateId"函数的形参传入了函数里去执行相关逻辑

  • 迷茫的小菜
    2019-12-06 14:25:13

    我说下我的理解,我是个菜鸡,所说的仅是我个人理解,不一定对,讲出来也不是为了误导各位,只是给个想法,其他同学也多个考虑的方向;

    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