【问题标题】:Defining function by name with arguments in struct在结构中使用参数按名称定义函数
【发布时间】:2023-02-21 00:17:06
【问题描述】:

我想生成一段具有不同参数的函数,以传递给一个通道,以便在从通道读取后运行。是否可以通过名称定义函数并在稍后调用的结构中指定参数?

https://go.dev/play/p/G9I7JEbA-Ol

package main

import (
    "context"
    "fmt"
)

type ExecutionFn func(ctx context.Context, args interface{}) (interface{}, error)

type Job struct {
    Name   string
    ExecFn ExecutionFn
    Args   interface{}
}

func (j Job) execute(ctx context.Context) (interface{}, error) {
    fmt.Printf("Running job: %s\n", j.Name)
    return j.ExecFn(ctx, j.Args)
}

func someFunction(description string, i int) (int, error) {
    fmt.Println(description)
    return i * 2, nil
}

func main() {
    ctx := context.TODO()
    i := 1
    job := Job{
        Name:   fmt.Sprintf("Job %d", i),
        ExecFn: someFunction,
        Args:   "Multiply by two", i, // the values of the args to go to "someFunction"
    }
    fmt.Printf("%#v\n", job)
    result, err := job.execute(ctx)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Result: %v", result)
}

【问题讨论】:

    标签: go


    【解决方案1】:

    将函数和参数打包在一个闭包中。

    type Job struct {
        Name   string
        ExecFn func()
    }
    
     ...
    
    job := Job{
        Name:   fmt.Sprintf("Job %d", i),
        ExecFn: func() { someFunction("Multiply by two", i) }
    }
    
    ...
    
    j.ExecFn() // invoke the function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 2016-08-23
      • 2020-10-18
      • 2018-06-22
      • 1970-01-01
      相关资源
      最近更新 更多