5.golang函数

//////////////////////////////////////
fun eval(a, b int, op string) int {
    switch op {
    case "+":
        return a + b
    case "-":
        return a - b 
    case "*":
        return a * b 
    case "/":
        return a / b
    default:
        panic("unsupported operation" + op)  
    }
}

fun eval(a, b int, op string) (int, error) {
    switch op {
    case "+":
        return a + b, nil
    case "-":
        return a - b, nil 
    case "*":
        return a * b, nil 
    case "/":
        return a / b, nil
    default:
        return 0, fmt.Errorf("unsupported operation: %s", op)  
    }
}
//////////////////////////////////////

/////////////////////////////////////
fun eval(a, b int) (int, int) {
    return a / b, a % b
}

fun eval(a, b int) (q, r int) {
    return a / b, a % b
}

// 不建议使用这种
fun eval(a, b int) (q, r int) {
    q = a / b
    r = a % b 
    return q, r
}
//////////////////////////////////////

//////////////////////////////////////
fun apply(op func(int, int) int, a, b int) int {
    // 获取函数名
    p := reflect.ValueOf(op).Pointer
    opName := runtime.FunForPc(p).Name
    fmt.Printf("Calling function %s with args " + "(%d, %d)", opName, a, b)
    return op(a, b)
}

// 重写pow函数
fun pow(a, b int) int {
    return int(math.Pow(float64(a), float64(b)))
}

apply(pow, 3, 4)

// 匿名函数
apply(func(a,b int) int {
    return int(math.Pow(float64(a), float64(b)))
}, 3, 4)
//////////////////////////////////////

//////////////////////////////////////
// 可变参数列表
func sun(numbers ...int) int {
    s := 0
    fori := range numbers {
        s += numbers[i]
    }
    return s
}
//////////////////////////////////////

在使用 Go 语言的 gRPC 库时,如果项目依赖了 `google.golang.org/grpc/naming` 包,但编译时报错提示找不到该包,这通常是因为从 gRPC 的某个版本开始(如 v1.48.0),官方对部分子模块进行了重构或移除[^2]。 ### 原因分析 gRPC Go 模块在较新的版本中(例如 v1.48.0)不再包含 `naming` 子包。这意味着如果项目代码中直接引用了 `google.golang.org/grpc/naming`,而 `go.mod` 中又没有锁定到一个仍然包含该包的旧版本,就会导致构建失败。 ### 解决方案 要解决这个问题,可以通过以下几种方式: #### 方法一:指定兼容版本 在 `go.mod` 文件中显式指定 gRPC 的版本为仍包含 `naming` 包的旧版本,例如 `v1.47.0`: ```go require google.golang.org/grpc v1.47.0 ``` 之后运行: ```bash go mod tidy ``` 确保依赖项正确更新。 #### 方法二:替换为替代实现 由于 `naming` 包已被弃用并移除,官方推荐使用 `grpc/resolver` 接口来实现服务发现功能。可以将原有基于 `naming` 的代码迁移到新的 resolver 接口上[^3]。例如: ```go import ( "google.golang.org/grpc/resolver" ) // 自定义 resolver 实现 type myResolver struct { cc resolver.ClientConn } func (r *myResolver) ResolveNow(o resolver.ResolveNowOptions) { // 实现解析逻辑 } func (r *myResolver) Close() { // 清理资源 } // 注册 resolver 构造函数 func init() { resolver.Register(resolver.BuilderFunc(func(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) { return &myResolver{cc: cc}, nil })) } ``` #### 方法三:使用第三方兼容库 社区可能提供了对旧版 `naming` 功能的兼容实现,可以搜索相关项目作为替代方案。 --- ### 总结 当前问题的根本原因是 gRPC Go 模块在新版本中移除了 `naming` 包,因此需要通过指定旧版本、迁移至新接口或使用替代方案来解决缺失包的问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值