小编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
查看次数

在golang中打印切片的地址

我在golang上很新.在这里,我有一个问题困惑了我一段时间.我知道我们应该使用"&"来获取地址,但如果我们在没有"&"的切片上使用printf会怎么样?

package main

import "fmt"

var slice = []int{1, 2, 3, 4}

func main() {

   fmt.Printf("address of slice %p \n", slice)

   fmt.Printf("address of slice %p \n", &slice)

}
Run Code Online (Sandbox Code Playgroud)

结果在我的MacBook上是这样的:

片的地址0x11354d0

片的地址0x1128be0

先感谢您!

arrays pointers go slice

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

如何检查切片头?

这是从切片略微修改的代码

var buffer [256] byte

func SubtractOneFromLength(slice []byte) []byte {
    slice = slice[0 : len(slice)-1]
    return slice
}

func main() {
    slice := buffer[10:20]
    fmt.Println("Before: len(slice) =", len(slice))
    newSlice := SubtractOneFromLength(slice)
    fmt.Println("After:  len(slice) =", len(slice))
    fmt.Println("After:  len(newSlice) =", len(newSlice))
    newSlice2 := SubtractOneFromLength(newSlice)
    fmt.Println("After:  len(newSlice2) =", len(newSlice2))
}
Run Code Online (Sandbox Code Playgroud)

它表示slice参数的内容可以通过函数修改,但其标题不能.如何在屏幕上打印newSlice2的标题?

go slice

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

如何用地图替换多个“ if-else-if”

我在多层if-else-if条件上遇到了一个问题,因此我想通过使用地图进行简短说明。

请在if-else-if中查看以下代码,以将其替换为地图。

function, args := APIstub.GetFunctionAndParameters()

if function == "queryProduce" {
    return s.queryProduce(APIstub, args)
} else if function == "initLedger" {
    return s.initLedger(APIstub)
} else if function == "createProduce" {
    return s.createProduce(APIstub, args)
} else if function == "queryAllProduces" {
    return s.queryAllProduces(APIstub)
} else if function == "changeProduceStatus" {
    return s.changeProduceStatus(APIstub, args)
}

return shim.Error("Invalid Smart Contract function name.")
}
Run Code Online (Sandbox Code Playgroud)

dictionary if-statement go

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

指针(别名)类型的接收者无效

这看起来很基础,但我无法轻松纠正以下程序 https://play.golang.org/p/8IJn7g0m1As


import (
    "fmt"
)

type A struct{ value int }
type B *A

func (b B) Print() {
    fmt.Printf("Value: %d\n", b.value)
}

func main() {
    a := &A{1}
    b := new(B(a))
    b.Print()

}
Run Code Online (Sandbox Code Playgroud)
./prog.go:10:6: invalid receiver type B (B is a pointer type)
./prog.go:16:12: B(a) is not a type
Run Code Online (Sandbox Code Playgroud)

首先,我尝试将接收器更改为func (b *B) ,但没有成功。对于第二个,我尝试过&B{a},但这也不起作用。

A实际上是一个复杂的结构体,里面有互斥体(由 生成的结构体protobuf),所以我需要将它保留为指针,同时需要在其上定义额外的方法,因此定义一个新类型B

methods pointers go

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