Go有类似Python的in关键字吗?我想检查一个值是否在列表中.
例如在Python中:
x = 'red'
if x in ['red', 'green', 'yellow', 'blue']:
print "found"
else:
print "not found"
Run Code Online (Sandbox Code Playgroud)
在Go中,我想出了使用set惯用法,但我不认为这是理想的,因为我必须指定一个我没有使用的int值.
x := "red"
valid := map[string]int{"red": 0, "green": 0,"yellow": 0, "blue": 0}
if _, ok := valid[x]; ok {
fmt.Println("found")
} else {
fmt.Println("not found")
}
Run Code Online (Sandbox Code Playgroud)
我知道有一个in关键字可能与泛型有关.有没有办法使用go generate或其他东西来做到这一点?
charCodeAt()JavaScript中的方法返回给定索引处字符的数字Unicode值,例如
"s".charCodeAt(0) // returns 115
Run Code Online (Sandbox Code Playgroud)
我将如何获取Go中相同字符串/字母的数字unicode值?
如果我正确使用频道,我是否需要使用互斥锁来防止并发访问?
嗨我想将查询参数转换为Go中的结构,例如我有这样的结构:
type Filter struct {
Offset int64 `json:"offset"`
Limit int64 `json:"limit"`
SortBy string `json:"sortby"`
Asc bool `json:"asc"`
//User specific filters
Username string `json:"username"`
First_Name string `json:"first_name"`
Last_Name string `json:"last_name"`
Status string `json:"status"`
}
Run Code Online (Sandbox Code Playgroud)
我有一个发送GET请求该情况下,用户可以指定可选参数Offset,Limit,SortBy,Asc,Username,First_Name,Last_Name,Status.
如果这些参数是在体内发送的那么我会这样做:
b, err := ioutil.ReadAll(r.Body)
if err != nil {
log.WithFields(logFields).Errorf("Reading Body Message:failed:%v", err)
return
}
var filter Filter
err = json.Unmarshal(b, &filter)
Run Code Online (Sandbox Code Playgroud)
但是我无法在GET请求中发送正文,那么解决方案是什么,而不是单独获取每个参数然后将它们放入结构中?
如果我返回作为函数或方法局部变量的数组切片会发生什么?Go 是否将数组数据复制到切片中make()?容量是否与切片大小或数组大小匹配?
func foo() []uint64 {
var tmp [100]uint64
end := 0
...
for ... {
...
tmp[end] = uint64(...)
end++
...
}
...
return tmp[:end]
}
Run Code Online (Sandbox Code Playgroud) 为了在模板中使用revel'seven关键字,我想在使用range. 有什么办法吗?我的地图具有以下结构:
map[string][]string
Run Code Online (Sandbox Code Playgroud) 在InsertOne用于创建新文档之后,当我返回结果时,我得到的是数组而不是数字ObjectID.在DB中,id生成正常.
type User struct {
ID string
Email string
Username string
Password string
}
var db = ...
// UserStore creates user
func UserStore(c echo.Context) (err error) {
coll := db.Collection("users")
u := new(User)
if err = c.Bind(u); err != nil {
return c.JSON(http.StatusInternalServerError, err)
}
result, err := coll.InsertOne(
context.Background(),
bson.NewDocument(
bson.EC.String("email", u.Email),
bson.EC.String("username", u.Username),
bson.EC.String("password", u.Password),
),
)
if err != nil {
return c.JSON(http.StatusInternalServerError, err)
}
return c.JSON(http.StatusCreated, result)
}
Run Code Online (Sandbox Code Playgroud)
这会返回类似于InsertedID: [90, …
我读了这篇文章,它有很好的指南,可以在 Go 中模拟 MongoDB。但是在方法Clone()和Copy()方法上也存在一些问题。我创建了这个接口和结构:
type ISession interface {
DB(name string) IDatabase
Close()
Clone() ISession
Copy() ISession
}
type IDatabase interface {
C(name string) ICollection
}
type MongoSession struct {
dbSession *mgo.Session
}
func (s MongoSession) DB(name string) IDatabase {
return &MongoDatabase{Database: s.dbSession.DB(name)}
}
func (s MongoSession) Clone() ISession {
//return session.clone
return s.dbSession.Clone()
}
func (s MongoSession) Copy() ISession {
return s.dbSession.Copy()
}
Run Code Online (Sandbox Code Playgroud)
但我收到了这个错误
不能使用 s.dbSession.Clone()(类型 *mgo.Session)作为返回参数中的 ISession 类型:*mgo.Session 没有实现 ISession(Clone 方法的类型错误)有 Clone() *mgo.Session …
一个指向数组的指针,让我们说:
p := uintptr(unsafe.Pointer(&array))
size := 5
Run Code Online (Sandbox Code Playgroud)
我无法访问变量array,上面的代码用于使其更清晰.
另外,我知道数组的大小,但size它不是常量,它会根据运行时间而变化.
现在,我想用已知的指针,大小以及数据类型初始化切片或数组.
我想出了以下代码:
data := make([]byte, size)
stepSize := unsafe.Sizeof(data[0])
for i := 0; i < size; i++ {
data[i] = *(*byte)(unsafe.Pointer(p))
p += stepSize
}
fmt.println(data)
Run Code Online (Sandbox Code Playgroud)
但是这个方法会进行内存复制,这可能是效率低下的,无论如何都没有复制?
PS我也试过以下两种方法,
// method 1
data := *(*[]byte)(unsafe.Pointer(p))
// method 2
data := *(*[size]byte)(unsafe.Pointer(p))
Run Code Online (Sandbox Code Playgroud)
但它会在运行时失败,我现在知道它的原因.
我一直在尝试获取noCopy适用于我自己的结构之一的指令,但我无法go vet检测到它。
我可以让它检测sync.WaitGroup, 和 的复制sync.Mutex,但不能检测我自己的结构。兽医源中的这个测试文件甚至不会用我的go vet.
或者,它发现了一些错误:
# command-line-arguments
./govet.go:56:6: no new variables on left side of :=
./govet.go:110:17: unsafe.Sizeof(mu) evaluated but not used
./govet.go:111:18: unsafe.Sizeof(mu) evaluated but not used
./govet.go:112:10: unsafe.Sizeof(mu) evaluated but not used
Run Code Online (Sandbox Code Playgroud)
但复制锁检测没有发现任何东西。
go vet自从1.4版本的讨论以来,有什么变化吗?我在跑go version go1.11 darwin/amd64。