我很好奇当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
我错过了什么?
我在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
先感谢您!
这是从切片略微修改的代码
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的标题?
我在多层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) 这看起来很基础,但我无法轻松纠正以下程序 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。
go ×10
json ×3
slice ×3
dictionary ×2
marshalling ×2
methods ×2
pointers ×2
string ×2
struct ×2
arrays ×1
godoc ×1
if-statement ×1
interface ×1