我在go中有一个深嵌套的结构。它们是由json解编组器构造的。
然而,这个结构中相当多的字段是“omitifempty”,所以我在op结尾时使用了一个结构,它可以在不同的地方有nills。
示例(真正的东西是更深层次的嵌套,并且很大: 400行结构):
package main
import "fmt"
type Foo struct {
Foo string
Bar *Bar
}
type Bar struct {
Bar string
Baz *Baz
}
type Baz struct {
Baz string
}
fun
我目前正在阅读 go包的源代码,以了解这个包是如何工作的。
我有一些关于文件文件的问题,该文件使用了我不懂的Go语言的一些元素,并且在文档中找不到精确的解释。
// InterfaceOf dereferences a pointer to an Interface type.
// It panics if value is not an pointer to an interface.
func InterfaceOf(value interface{}) reflect.Type {
t := reflect.TypeOf(value)
for t.K
我不知道这在Go中是否可行,但是如果我在一个零结构上调用一个方法,有什么方法可以填充它吗?
我想做的是:
type A struct {
Name string
}
func (a *A) DoStuff() {
if a == nil {
a = &A{Name: "hello"}
}
}
func main() {
var a *A
a.DoStuff()
println(a.Name) // want "hello"
}
但是上面没有使用a实例填充A{},这可能是预期的。
有什么
以下是http/request.go第290行源代码的摘录:
// WithContext returns a shallow copy of r with its context changed
// to ctx. The provided ctx must be non-nil.
func (r *Request) WithContext(ctx context.Context) *Request {
if ctx == nil {
panic("nil context")
}
r2 := new(Request) //
我有一段反射代码,它试图通过名称获取结构上的字段,然后检查该字段是否存在: type test struct {
A bool
B bool
}
t := new(test)
metaValue := reflect.ValueOf(t).Elem()
field := metaValue.FieldByName(name)
if field.IsZero() {
glog.Errorf("Field %s was not on the struct", inner)
} 根据FieldByName上的文档,如果找不到任何字段,此函数应返回零值。但是,下
程序读取
package main
import "fmt"
func main() {
var name string = nil
fmt.Println(name)
}
并产生一个错误
prog.go:6: cannot use nil as type string in assignment
我理解。我不明白为什么我不能将nil分配给我的string。
我对go非常陌生,并且已经使用API端点部署了一个小服务。
我听说/读到go不使用try/catch,所以我正在尝试弄清楚如何从我的应用程序接口中“捕捉”服务调用中发生的任何问题,并确保资源服务器不会宕机。
我的API代码如下所示。
我有一个包含以下内容的routes.go文件
package main
import (
"net/http"
"github.com/gorilla/mux"
)
type Route struct {
Name string
Method string
Pat
对于bool类型来说,Go的零值是false。Postgres支持未定义的BOOL类型,表示为NULL。这会导致在Go中从Postgres获取BOOL值时出现问题:
rows,err := db.Query("SELECT UNNEST('{TRUE,FALSE,NULL}'::BOOL[])");
if err != nil {
log.Fatal(err)
}
for rows.Next() {
var value bool
if err := rows.Scan(&value); err != nil {
l
我在Go中有一个包含互斥的结构,我想确保这个互斥永远不是nil。为此,我实现了一个GetMutex()函数,它检查互斥是否为零,如果是,则为它赋值。
我的问题是:下面的代码线程是否安全?如果不是,什么是确保mux始终被初始化的惯用方式?我唯一能想到的就是在这个包中有一个全局互斥体,这个包是在我的GetMutex()函数中使用的,但是也许有一种不同的方法。
package main
import (
"sync"
)
type Counter struct {
mux *sync.Mutex
counter int
}
// Is this thre
采用以下模式:
type User struct {
UUID string `gorm:"primary_key"`
Name string `gorm:"NOT NULL"`
CreatedAt time.Time
UpdatedAt time.Time
}
如果您对而不是的用户执行以下go-gorm查询:
var user User
db.First(&user)
最后收到的是填充日期字段的空结构。是否有一种方法来代替只接收一个nil结构返回,或者我是不是以错误的方式思考这个问题?
假设我们有以下几点:
type I interface {
M()
}
func main() {
var i I
i.M()
}
为什么Go不对编译类型进行一些静态分析,以检查接口的底层值是否为零,并抛出编译时错误?相反,我们最终在i.M()上抛出一个运行时异常
==================================================================
输出:
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb
所以,我有struct P,我需要将一些json数据解压缩到P中,但有时它是嵌入的struct,Embedded。在这两种情况下,我将json从API中解封,并需要格式化“格式化”字段。在嵌入的情况下,我的解编组器似乎没有被调用。
I
package main
import (
"encoding/json"
"fmt"
)
type P struct {
Name string `json:"name"`
Formatted string `json:"formatted"`
}
我有个很不寻常的情况。我希望MarshalJSON有条件地省略一个struct字段。在下面的示例中,我们的想法是省略B Bool字段的输出,如果是B.Value == B.Undefined。
type Bool struct {
// Current value
Value bool
// Value if undefined
Undefined bool
}
func (b Bool) MarshalJSON() ([]byte, error) {
if b.Value == b.Undefined {
return []byte{
我有相当多的数据结构,大多包含数字,我得到数据,进行计算并返回结果。
问题是,所有这些数字都可以是零,因此,我不得不切换到使用指针(*int64或*float64),这样默认的是nil而不是0。
不幸的是,除了使用指针之外,我不知道Go中有什么解决方案。
这个问题出现在为所有数据结构实现的Calculate()函数中:
type X struct {
A, B, C, D, E, F *int
// and much more
Result *float64
}
func (x *X) Calculate() {
floatptr := func(f flo
我正在尝试使用github.com/jackc/pgx将从Postgres检索到的UUID读取到uuid.UUID类型的变量中(从github.com/google/uuid包中)。
示例代码可以是:
var dbId = uuid.UUID
err = db.Pool.QueryRow("SELECT id FROM users WHERE objectname = $1;", objectUUID.String()).Scan(&dbId)
if err != nil {
log.Printf("Failed to fetch from dat