小编icz*_*cza的帖子

检查值是否在列表中

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或其他东西来做到这一点?

dictionary set go

6
推荐指数
1
解决办法
5620
查看次数

Go lang相当于JavaScript的charCode()方法

charCodeAt()JavaScript中的方法返回给定索引处字符的数字Unicode值,例如

"s".charCodeAt(0) // returns 115
Run Code Online (Sandbox Code Playgroud)

我将如何获取Go中相同字符串/字母的数字unicode值?

string unicode go

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

如果我正确使用频道,我是否需要使用互斥锁?

如果我正确使用频道,我是否需要使用互斥锁来防止并发访问?

concurrency mutex channel go

6
推荐指数
1
解决办法
881
查看次数

如何将所有GET请求查询参数放入Go中的结构中?

嗨我想将查询参数转换为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请求中发送正文,那么解决方案是什么,而不是单独获取每个参数然后将它们放入结构中?

struct http go query-parameters

6
推荐指数
1
解决办法
7806
查看次数

在 Go 函数中返回局部数组的一部分是否安全?

如果我返回作为函数或方法局部变量的数组切片会发生什么?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)

arrays return return-value go slice

6
推荐指数
1
解决办法
3460
查看次数

迭代 Go 地图获取索引

为了在模板中使用revel'seven关键字,我想在使用range. 有什么办法吗?我的地图具有以下结构:

map[string][]string
Run Code Online (Sandbox Code Playgroud)

dictionary go go-templates revel

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

Mongo-go-driver从插入结果中获取objectID

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, …

json http go mongodb mongo-go

6
推荐指数
1
解决办法
5274
查看次数

如何在 Go 中模拟 MongoDB 中添加克隆和复制功能?

我读了这篇文章,它有很好的指南,可以在 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 …

go mongodb mgo

6
推荐指数
1
解决办法
411
查看次数

如何从golang中的数组unsafe.Pointer创建数组或切片?

一个指向数组的指针,让我们说:

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)

但它会在运行时失败,我现在知道它的原因.

arrays pointers unsafe go slice

6
推荐指数
2
解决办法
1540
查看次数

没有复制最小的例子?

我一直在尝试获取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

struct mutex go

6
推荐指数
1
解决办法
3077
查看次数