我很好奇当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并找出它是否具有所有方法.是这样,还是有一些聪明的魔法在下面发生?
假设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文件中是否可以有私有字段?
在 Golang 中,我有以下三个字段的 Struct
type Person struct {
name string
age int
rank int
}
Run Code Online (Sandbox Code Playgroud)
对于处理,我需要一个等级字段,但对于输出,我想从结构中排除等级字段,因为我直接将上面的结构传递给 JSON 编码器以抛出响应。
有什么方法可以取消 Struct 中的排名字段?
我知道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>一切都会很好)
这是“按原样”添加嵌套 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) 我无法理解的自定义元帅的一个奇怪的行为int来string.
这是一个例子:
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
我错过了什么?
我对 Go 和 Mongodb 都很陌生,正在用 Go 和 Mongo 编写我的第一个 rest-api。我正在使用mongo-go-driver并Modal在 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 随机生成的字符串而不是实际的主机名字符串值。
那么有没有办法做到这一点。
假设我有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操作的接收者信息。
我有两个问题:
TypeOf上面的调用中获取代码片段中的接收者类型吗?尝试自己回答第二个问题,并根据我在官方文档中看到的内容,看来我唯一的选择是传递TypeOf(receiver)和TypeOf(receiver.method)或TypeOf(receiver)以及接收方的方法名称。
所以,我创建了一个字符串变量使用
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)
谢谢您的帮助。
我有一个像这样的字符串:
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 中编写代码并获得我想要的输出?