我想在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字段的新结构类型?或者是其他东西?
粗略的时间使用reflect包使用struct字段.特别是,还没弄清楚如何设置字段值.
type t struct { fi int; fs string }
var r t = t{ 123, "jblow" }
var i64 int64 = 456
得到字段的名称我 - 这似乎工作
var field = reflect.TypeOf(r).Field(i).Name
获得字段i的值作为a)接口{},b)int - 这似乎有效
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
设置字段的值i - 尝试一个 - 恐慌
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic:reflect.Value·SetInt使用未导出字段获得的值
假设它不喜欢字段名称"id"和"name",所以重命名为"Id"和"Name"
a)这个假设是否正确?
b)如果正确,认为没有必要,因为在同一个文件/包中
设置字段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 )
他还记录了字段名称必须是可导出的(以大写字母开头)
我想让下面的代码编译。通过阅读类型参数提案(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) 我试图了解 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?
(显然我可以使用共享方法定义一个接口并直接使用它。但在我的特定用例中,我想明确限制为某些类型。)