相关疑难解决方法(0)

如何在go中添加新方法到现有类型?

我想在gorilla/mux路由和路由器类型上添加一个方便的util方法:

package util

import(
    "net/http"
    "github.com/0xor1/gorillaseed/src/server/lib/mux"
)

func (r *mux.Route) Subroute(tpl string, h http.Handler) *mux.Route{
    return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h)
}

func (r *mux.Router) Subroute(tpl string, h http.Handler) *mux.Route{
    return r.PathPrefix("/" + tpl).Subrouter().PathPrefix("/").Handler(h)
}
Run Code Online (Sandbox Code Playgroud)

但是编译器通知我

无法在非本地类型mux.Router上定义新方法

那我怎么做到这一点?我是否创建了一个具有匿名mux.Route和mux.Router字段的新结构类型?或者是其他东西?

extension-methods go

100
推荐指数
2
解决办法
5万
查看次数

使用reflect,如何设置struct字段的值?

粗略的时间使用reflect包使用struct字段.特别是,还没弄清楚如何设置字段值.

type t struct { fi int; fs string }
var r t = t{ 123, "jblow" }
var i64 int64 = 456
  1. 得到字段的名称我 - 这似乎工作

    var field = reflect.TypeOf(r).Field(i).Name

  2. 获得字段i的值作为a)接口{},b)int - 这似乎有效

    var iface interface{} = reflect.ValueOf(r).Field(i).Interface()

    var i int = int(reflect.ValueOf(r).Field(i).Int())

  3. 设置字段的值i - 尝试一个 - 恐慌

    reflect.ValueOf(r).Field(i).SetInt( i64 )

    panic:reflect.Value·SetInt使用未导出字段获得的值

    假设它不喜欢字段名称"id"和"name",所以重命名为"Id"和"Name"

    a)这个假设是否正确?

    b)如果正确,认为没有必要,因为在同一个文件/包中

  4. 设置字段i的值 - 尝试两个(字段名称大写) - 恐慌

    reflect.ValueOf(r).Field(i).SetInt( 465 )

    reflect.ValueOf(r).Field(i).SetInt( i64 )

    恐慌:反映.值/ SetInt使用不可寻址的值


@peterSO下面的说明是彻底和高质量的

四.这工作:

reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )

他还记录了字段名称必须是可导出的(以大写字母开头)

reflection go go-reflect

94
推荐指数
2
解决办法
7万
查看次数

如何使用泛型访问结构体字段(类型 T 没有字段或方法)?

我想让下面的代码编译。通过阅读类型参数提案(Go Generics),我的理解是这应该可行,但我一定错过了一些东西。

package main

import "fmt"

func main() {
    s := Struct{A: "Hello World!"}
    PrintA(s)
}

func PrintA[T Type](v T) {
    fmt.Printf("%s\n", v.A)
}

type Type interface {
    struct{ A string }
}

type Struct struct {
    A string
}

func (s Struct) String() string {
    return s.A
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

./prog.go:7:8:Struct 未实现 Type(约束 Type 中的 struct{A string} 可能缺少 ~)
./prog.go:11:23:vA 未定义(类型 T 没有字段或方法 A )

我想T用特定类型的特定字段来表示所有结构。添加~没有帮助。

以下是已实施的提案中的一个示例,它是最新 Go beta 版本的一部分。

type structField interface {
    struct { …
Run Code Online (Sandbox Code Playgroud)

generics field go

19
推荐指数
1
解决办法
1万
查看次数

在 Go 泛型中,如何对联合约束中的类型使用通用方法?

我试图了解 Go 泛型(v1.18)中类型联合约束的用法。这是我尝试过的代码:

type A struct {
}

type B struct {
}

type AB interface {
    *A | *B
}

func (a *A) some() bool {
    return true
}

func (b *B) some() bool {
    return false
}

func some[T AB](x T) bool {
    return x.some()   // <- error
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨:

x.some未定义(类型T没有字段或方法)

这是为什么?*A如果我不能使用and类型的共享方法*B,那么定义类型 union 的意义何在*A | *B

(显然我可以使用共享方法定义一个接口并直接使用它。但在我的特定用例中,我想明确限制为某些类型。)

generics go

15
推荐指数
1
解决办法
1万
查看次数

标签 统计

go ×4

generics ×2

extension-methods ×1

field ×1

go-reflect ×1

reflection ×1