小编icz*_*cza的帖子

键入断言接口,内部发生的事情

我很好奇当Go执行类型断言而另一个接口是其目标时,内部会发生什么.仅举例来说,请考虑Dave Cheney的博客中的这个例子:

type temporary interface {
    Temporary() bool
}

// IsTemporary returns true if err is temporary.
func IsTemporary(err error) bool {
        te, ok := err.(temporary)
        return ok && te.Temporary()
}
Run Code Online (Sandbox Code Playgroud)

我希望在这里发生很多运行时开销,因为它必须检查类型err并找出它是否具有所有方法.是这样,还是有一些聪明的魔法在下面发生?

methods interface go type-assertion

2
推荐指数
1
解决办法
91
查看次数

Protobuf,Go和私人领域

假设Player我的.proto文件已经定义了.

message Player {
  string first_name = 1;
  string last_name = 2;
  int32 user_id = 3;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用https://github.com/twitchtv/twirp在我的Go后端和我的JavaScript前端之间进行通信.如果您不知道Twirp,它只是JSON RPC over HTTP 1.1.

Player消息被转换成细末结构

type Player struct {
  FirstName string
  LastName string
  UserId int32
}
Run Code Online (Sandbox Code Playgroud)

众所周知,大写字段是公开的.但是我想保持UserId私有,即将其设为小写.前端的用户不应该看到UserId播放器的用户.在我的后端,我需要这些信息,所以我不能简单地删除该字段.

任何想法如何处理这种情况?我的.proto文件中是否可以有私有字段?

struct go protocol-buffers

2
推荐指数
1
解决办法
343
查看次数

Golang 未设置结构域

在 Golang 中,我有以下三个字段的 Struct

type Person struct {
   name string
   age  int
   rank int
}
Run Code Online (Sandbox Code Playgroud)

对于处理,我需要一个等级字段,但对于输出,我想从结构中排除等级字段,因为我直接将上面的结构传递给 JSON 编码器以抛出响应。

有什么方法可以取消 Struct 中的排名字段?

json struct marshalling go

2
推荐指数
1
解决办法
2529
查看次数

GoDoc添加换行符

我知道Golang通过以功能名称(拼写为“ func”)开头的单行注释来支持功能文档。但是,这有一个令人作呕的副作用:具有多个单行注释将不会生成带有换行符的GoDoc,该换行符将文本的每一行分开

这是一张图片来说明:

在此处输入图片说明

这是函子及其文档:

//GetFunctionName gets function name
// Parameters:
// - `i` : Function
// **NOTE** this func fails if `i` is a variable set to a func
// (they're called "anonymous functions" in JavaScript)
func GetFunctionName(i interface{}) string {
    return runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name()
}
Run Code Online (Sandbox Code Playgroud)

如何在生成的文档中插入换行符?(如果这是Javadoc,我希望<br>一切都会很好)

documentation go godoc

2
推荐指数
1
解决办法
722
查看次数

是否可以在 Go 中“按原样”添加嵌套的 json?

这是“按原样”添加嵌套 json 的可能方法吗?嵌套的 json 没有任何结构,可能会有所不同。我需要将嵌套的json数据直接放到根节点。

https://play.golang.org/p/MzBt7DLQEpD

type RootJson struct {
    NestedJson []byte
    AdditionalField string
}

func main() {
    nestedJson := []byte("{\"number\": 1, \"string\": \"string\", \"float\": 6.56}")

    rootJson := RootJson{nestedJson, "additionalField"}
    payload, _ := json.Marshal(&rootJson)

    fmt.Println(string(payload))

}
Run Code Online (Sandbox Code Playgroud)

string json marshalling go

2
推荐指数
1
解决办法
71
查看次数

如何在JSON中自定义封送映射键

我无法理解的自定义元帅的一个奇怪的行为intstring.

这是一个例子:

package main

import (
    "encoding/json"
    "fmt"
)

type Int int

func (a Int) MarshalJSON() ([]byte, error) {
    test := a / 10
    return json.Marshal(fmt.Sprintf("%d-%d", a, test))
}

func main() {

    array := []Int{100, 200}
    arrayJson, _ := json.Marshal(array)
    fmt.Println("array", string(arrayJson))

    maps := map[Int]bool{
        100: true,
        200: true,
    }
    mapsJson, _ := json.Marshal(maps)
    fmt.Println("map wtf?", string(mapsJson))
    fmt.Println("map must be:", `{"100-10":true, "200-20":true}`)
}
Run Code Online (Sandbox Code Playgroud)

输出是:

array ["100-10","200-20"]
map wtf? {"100":true,"200":true}
map must be: {"100-10":true, "200-20":true}
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/iiUyL2Hc5h_P

我错过了什么?

string json dictionary go slice

2
推荐指数
1
解决办法
1045
查看次数

在 Mongo-go-driver 中创建一个独特的领域

我对 Go 和 Mongodb 都很陌生,正在用 Go 和 Mongo 编写我的第一个 rest-api。我正在使用mongo-go-driverModal在 Go 中有以下结构

type Modal struct {
    Group     []string           `bson:"group" json:"group"`
    Hostname  string             `bson:"hostname" json:"hostname"`
    Overrides map[string]string  `bson:"overrides" json:"overrides"`
    Excludes  []string           `bson:"excludes" json:"excludes"`
}
Run Code Online (Sandbox Code Playgroud)

我不想使用ObjectIdmongo-db 提供的默认字段作为我的主键,而是希望将该Hostname字段作为主键。

如果我将Hostname字段的类型设置为primitive.ObjectID,那么hostname它将是唯一的,但它的值将由 mongodb 随机生成的字符串而不是实际的主机名字符串值。

那么有没有办法做到这一点。

go mongodb bson mongo-go

2
推荐指数
1
解决办法
4742
查看次数

为什么typeof(method)不返回reflect.Method实例?

假设我有Foo结构,其方法定义如下:

type Foo struct {
    Name string
}

func (f *Foo) Get(a int, b string) (string, error) {
    return f.Name, nil
}
Run Code Online (Sandbox Code Playgroud)

如果我写

obj := &Foo{}
t := reflect.TypeOf(obj.Get)
Run Code Online (Sandbox Code Playgroud)

t.Kind()返回reflect.Func,显然我无法访问Get我从“属于” Foo结构中提取类型信息的函子,即接收方是Foo类型,甚至没有出现在参数中。

我想这是故意的,我想念一些有关函数的基本知识,这些函数使语言作者丢弃了应用于方法引用的typeof操作的接收者信息。

我有两个问题:

  1. 我是正确的,没有办法在TypeOf上面的调用中获取代码片段中的接收者类型吗?
  2. 如果我想将有关方法的反射信息传递给打算分析功能和相关接收者的代码(实质上是方法),我有什么选择?

尝试自己回答第二个问题,并根据我在官方文档中看到的内容,看来我唯一的选择是传递TypeOf(receiver)和TypeOf(receiver.method)或TypeOf(receiver)以及接收方的方法名称。

reflection methods types go

2
推荐指数
1
解决办法
50
查看次数

有没有办法做 Sprintf 结果的逆运算

所以,我创建了一个字符串变量使用

name := "Batman"
age := 38
nameAndAge = fmt.Sprintf("%s %d", name, age)
Run Code Online (Sandbox Code Playgroud)

在另一个函数中,我可以访问变量nameAndAge。现在我想取回我在Sprintf. 我能想到的一种不经意的方法是根据分隔符拆分它并创建变量。我想知道是否有任何功能可以做到这一点?

喜欢,

var name string
var age int
// " " is the separator here
fmt.ReverseSprintf(nameAndAge, " ", name, age)
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助。

string printf go

2
推荐指数
1
解决办法
306
查看次数

如何迭代 go 中字符串中的每 2 个连续字符?

我有一个像这样的字符串:

package main

import "fmt"

func main() {
    some := "p1k4"

    for i, j := range some {
            fmt.Println()
    }
}
Run Code Online (Sandbox Code Playgroud)

我想取出字符串中的每两个连续字符并打印它们。输出应该像p1, 1k, k4, 4p.

我已经尝试过,但仍然无法找到答案,我应该如何在 go 中编写代码并获得我想要的输出?

string go

2
推荐指数
1
解决办法
663
查看次数