javascript

git

java

python

git-remote

c++

github

django

c#

reactjs

html5

analytics

node.js

performance

branch-prediction

git-commit

git-revert

validation

email-validation

undefined

安装-如何从下载源安装golang第三方项目?

我正在尝试安装mgo,它是用golang编写的mongo驱动程序。

标准命令:

go get launchpad.net/mgo

但是由于某些证书问题而失败。

所以我手动将mgo的源下载到本地E:\mgo,但是我不知道如何安装。

文件树:

├─.bzr
│  ├─branch
│  │  └─lock
│  ├─branch-lock
│  ├─checkout
│  │  └─lock
│  └─repository
│      ├─indices
│      ├─lock
│      ├─obsolete_packs
│      ├─packs
│      └─upload
├─bson
└─testdb

我试过了:

cd mgo
go install

它报告:

auth.go:34:2: import "launchpad.net/mgo/bson": cannot find package

但是,如果我尝试先安装bson:

cd bson
go install

它报告另一个错误:

go install: no install location for _/E_/mgo/bson

那么,正确的安装命令是什么?

trans by 2020-08-06T00:55:03Z

go-为什么添加并发会使该golang代码变慢?

我已经修改了一些Go代码,以解决与我姐夫玩的视频游戏有关的我的好奇心。

本质上,下面的代码模拟了游戏中与怪物的互动,以及他期望他们在失败后掉落物品的频率。 我遇到的问题是,我希望像这样的一段代码对于并行化是完美的,但是当我并发添加时,完成所有模拟所花费的时间往往会使原始代码的速度降低4-6倍 没有并发。

为了让您更好地理解代码的工作方式,我提供了三个主要功能:交互功能,它是玩家和怪物之间的简单交互。 如果怪物掉落物品,则返回1,否则返回0。 模拟功能会运行多个互动,并返回互动结果的一部分(即1和0代表成功/失败的互动)。 最后,有一个测试函数,它运行一组模拟并返回一部分模拟结果,这些结果是导致掉落物品的交互总数。 这是我试图并行运行的最后一个函数。

现在,我可以理解,如果我为要运行的每个测试创建一个goroutine,为什么代码会变慢。 假设我正在运行100个测试,则在MacBook Air的4个CPU上的每个goroutine之间进行上下文切换会降低性能,但是我只创建与我拥有的处理器一样多的goroutine,并将测试次数除以 goroutines。 我希望这实际上可以提高代码的性能,因为我可以并行运行每个测试,但是,当然,我会遇到严重的问题。

我很想知道为什么会这样,所以任何帮助将不胜感激。

以下是不带go例程的常规代码:

package main

import (
    "fmt"
    "math/rand"
    "time"
)

const (
    NUMBER_OF_SIMULATIONS = 1000
    NUMBER_OF_INTERACTIONS = 1000000
    DROP_RATE = 0.0003
)

/**
 * Simulates a single interaction with a monster
 *
 * Returns 1 if the monster dropped an item and 0 otherwise
 */
func interaction() int {
    if rand.Float64() <= DROP_RATE {
        return 1
    }
    return 0
}

/**
 * Runs several interactions and retuns a slice representing the results
 */
func simulation(n int) []int {
    interactions := make([]int, n)
    for i := range interactions {
        interactions[i] = interaction()
    }
    return interactions
}

/**
 * Runs several simulations and returns the results
 */
func test(n int) []int {
    simulations := make([]int, n)
    for i := range simulations {
        successes := 0
        for _, v := range simulation(NUMBER_OF_INTERACTIONS) {
            successes += v
        }
        simulations[i] = successes
    }
    return simulations
}

func main() {
    rand.Seed(time.Now().UnixNano())
    fmt.Println("Successful interactions: ", test(NUMBER_OF_SIMULATIONS))
}

并且,这是带有goroutines的并发代码:

package main

import (
    "fmt"
    "math/rand"
    "time"
    "runtime"
)

const (
    NUMBER_OF_SIMULATIONS = 1000
    NUMBER_OF_INTERACTIONS = 1000000
    DROP_RATE = 0.0003
)

/**
 * Simulates a single interaction with a monster
 *
 * Returns 1 if the monster dropped an item and 0 otherwise
 */
func interaction() int {
    if rand.Float64() <= DROP_RATE {
        return 1
    }
    return 0
}

/**
 * Runs several interactions and retuns a slice representing the results
 */
func simulation(n int) []int {
    interactions := make([]int, n)
    for i := range interactions {
        interactions[i] = interaction()
    }
    return interactions
}

/**
 * Runs several simulations and returns the results
 */
func test(n int, c chan []int) {
    simulations := make([]int, n)
    for i := range simulations {
        for _, v := range simulation(NUMBER_OF_INTERACTIONS) {
            simulations[i] += v
        }
    }
    c <- simulations
}

func main() {
    rand.Seed(time.Now().UnixNano())

    nCPU := runtime.NumCPU()
    runtime.GOMAXPROCS(nCPU)
    fmt.Println("Number of CPUs: ", nCPU)

    tests := make([]chan []int, nCPU)
    for i := range tests {
        c := make(chan []int)
        go test(NUMBER_OF_SIMULATIONS/nCPU, c)
        tests[i] = c
    }

    // Concatentate the test results
    results := make([]int, NUMBER_OF_SIMULATIONS)
    for i, c := range tests {
        start := (NUMBER_OF_SIMULATIONS/nCPU) * i
        stop := (NUMBER_OF_SIMULATIONS/nCPU) * (i+1)
        copy(results[start:stop], <-c)
    }

    fmt.Println("Successful interactions: ", results)
}

更新(13/12/13 18:05)

我在下面添加了新版本的并发代码,该代码根据下面“系统”的建议为每个goroutine创建一个新的Rand实例。 现在,与串行版本的代码相比,我看到了非常小的速度提升(总花费时间减少了15-20%)。 我很想知道为什么我没有将时间减少75%左右的时间,因为我将工作量分散在MBA的4个核心上。 有没有人有其他建议可以帮助您?

package main

import (
    "fmt"
    "math/rand"
    "time"
    "runtime"
)

const (
    NUMBER_OF_SIMULATIONS = 1000
    NUMBER_OF_INTERACTIONS = 1000000
    DROP_RATE = 0.0003
)

/**
 * Simulates a single interaction with a monster
 *
 * Returns 1 if the monster dropped an item and 0 otherwise
 */
func interaction(generator *rand.Rand) int {
    if generator.Float64() <= DROP_RATE {
        return 1
    }
    return 0
}

/**
 * Runs several interactions and retuns a slice representing the results
 */
func simulation(n int, generator *rand.Rand) []int {
    interactions := make([]int, n)
    for i := range interactions {
        interactions[i] = interaction(generator)
    }
    return interactions
}

/**
 * Runs several simulations and returns the results
 */
func test(n int, c chan []int) {
    source := rand.NewSource(time.Now().UnixNano())
    generator := rand.New(source)
    simulations := make([]int, n)
    for i := range simulations {
        for _, v := range simulation(NUMBER_OF_INTERACTIONS, generator) {
            simulations[i] += v
        }
    }
    c <- simulations
}

func main() {
    rand.Seed(time.Now().UnixNano())

    nCPU := runtime.NumCPU()
    runtime.GOMAXPROCS(nCPU)
    fmt.Println("Number of CPUs: ", nCPU)

    tests := make([]chan []int, nCPU)
    for i := range tests {
        c := make(chan []int)
        go test(NUMBER_OF_SIMULATIONS/nCPU, c)
        tests[i] = c
    }

    // Concatentate the test results
    results := make([]int, NUMBER_OF_SIMULATIONS)
    for i, c := range tests {
        start := (NUMBER_OF_SIMULATIONS/nCPU) * i
        stop := (NUMBER_OF_SIMULATIONS/nCPU) * (i+1)
        copy(results[start:stop], <-c)
    }

    fmt.Println("Successful interactions: ", results)
}

更新(01/13/13 17:58)

谢谢大家对解决我的问题的帮助。 我终于得到了我一直在寻找的答案,所以我想在这里对那些有相同问题的人做一下总结。

从本质上讲,我有两个主要问题:首先,即使我的代码令人尴尬地并行执行,但是当我在可用处理器之间分配代码时,它的运行速度却变慢了;其次,该解决方案带来了另一个问题,即我的串行代码运行了两次。与在单个处理器上运行的并发代码一样慢,您可能希望大致相同。在这两种情况下,问题都是随机数生成器函数Rand。基本上,这是rand.Float64软件包提供的便利函数。在该程序包中,每个便捷功能都创建并使用了Rand结构的全局实例。此全局Rand实例具有与其关联的互斥锁。由于使用了此便利函数,因此我无法真正并行化代码,因为每个goroutine必须排队才能访问全局Rand实例。解决方案(如下面的“系统”所示)是为每个goroutine创建一个Rand结构的单独实例。这解决了第一个问题,但创建了第二个问题。

第二个问题是我的非并行并发代码(即,仅使用一个处理器运行的并发代码)的运行速度是顺序代码的两倍。 这样做的原因是,即使我仅使用单个处理器和单个goroutine运行,该goroutine仍具有自己创建的Rand结构的实例,并且在创建时没有互斥锁。 顺序代码仍在使用rand.Float64便利函数,该便利函数使用了受全局互斥锁保护的Rand实例。 获得该锁的成本导致顺序代码的运行速度慢了一倍。

因此,故事的寓意是,每当性能很重要时,请确保您创建Rand结构的实例并从中调用所需的函数,而不是使用程序包提供的便捷函数。

trans by 2020-08-02T05:32:34Z

go-如何在golang中实现基于级别的日志记录?

在golang中是否有任何适用于基于级别的日志记录的好的包装器?如果没有,我应该如何自己实施?

我想要的很简单。 我想要一些功能,例如

log.Error()
log.Info()

等将其输出显示到stdout并将其保存在日志文件中(基于作为命令行参数提供给程序的级别)。如何实现此包装器?

trans by 2020-07-29T11:46:44Z

包-Go工作区的最佳做法是什么?

我刚开始学习Go,并通读现有代码以学习“其他人的做法”。 在这种情况下,遍历使用go“工作区”,尤其是与项目依赖关系有关的工作。

在处理各种Go项目时,使用一个或多个Go工作区(即$ GOPATH的定义)的常见(最佳实践)是什么? 我应该期望有一个类似于我所有项目的中央代码存储库的Go工作区,还是在我处理这些项目时都明确将其分解并设置$ GOPATH(有点像python) virtualenv)?

trans by 2020-07-28T20:50:51Z

go-使用golang生成字符串的SHA哈希

有人可以给我展示一个如何使用Go 1生成我拥有的字符串(例如myPassword := "beautiful")的SHA哈希的工作示例吗?

文档页面缺少示例,我在Google上找不到任何有效的代码。

trans by 2020-07-28T11:08:23Z

字典-指向地图的指针

将某些地图定义为:

var valueToSomeType = map[uint8]someType{...}
var nameToSomeType = map[string]someType{...}

我想要一个指向地图地址的变量(不要复制所有变量)。 我尝试使用:

valueTo := &valueToSomeType
nameTo := &nameToSomeType

但在使用valueTo[number]时,它显示
内部编译器错误:无类型的var,初始化:new

如何获得?

编辑

该错误由另一个问题显示。

trans by 2020-07-28T05:43:07Z

go-如何在Golang中使用未知参数执行系统命令

我有一堆系统命令,它们类似于将新内容附加到文件中。 我编写了一个简单的脚本来执行系统命令,如果有单个单词,如“ ls”,“ date”等,它会很好地工作。但是如果命令大于此范围,程序就会死掉。

以下是代码

package main

import (
    "fmt"
    "os/exec"
    "sync"
)

func exe_cmd(cmd string, wg *sync.WaitGroup) {
    fmt.Println(cmd)
    c = cmd.Str
    out, err := exec.Command(cmd).Output()
    if err != nil {
        fmt.Println("error occured")
        fmt.Printf("%s", err)
    }
    fmt.Printf("%s", out)
    wg.Done()
}

func main() {
    wg := new(sync.WaitGroup)
    wg.Add(3)

    x := []string{"echo newline >> foo.o", "echo newline >> f1.o", "echo newline >> f2.o"}
    go exe_cmd(x[0], wg)
    go exe_cmd(x[1], wg)
    go exe_cmd(x[2], wg)

    wg.Wait()
}

以下是我看到的错误

exec: "echo newline >> foo.o": executable file not found in $PATHexec: 
"echo newline >> f2.o": executable file not found in $PATHexec: 
"echo newline >> f1.o": executable file not found in $PATH 

我想,这可能是由于未单独发送cmds和参数([http://golang.org/pkg/os/exec/#Command])引起的。 我想知道如何颠覆这一点,因为我不知道命令中将要执行多少个参数。

trans by 2020-07-26T11:41:29Z

if语句-如果不是true(!true)

在golang的template / html包中,我可以使用{{ if .loggedIn }}检查登录是否为true。

如何在不使用me或eq的情况下检查.logged In是否为假?


例如,我正在寻找类似的东西

{{ if !.loggedIn }}
<h1>Not logged in</h1>
{{ end }}
trans by 2020-07-25T18:19:08Z

c-在Go(Golang)中编写Python扩展

我目前使用Cython链接C和Python,并以慢速的python代码获得加速。 但是,我想使用goroutines来实现一个非常慢(并且非常可并行化)的代码,但是它必须可以从python调用。 (我已经看过这个问题了)

如果有必要,我很乐意通过C(或Cython)来设置数据结构等,但是从错误修复/避免的角度来看,避免这一额外的层将是一件好事。

无需重新发明轮子的最简单方法是什么?

trans by 2020-07-25T18:07:03Z

go-golang中没有布尔值的XOR运算符?

Golang中是否没有布尔值的XOR运算符?

我试图做类似b1^b2的操作,但是它没有为布尔值定义。

trans by 2020-07-25T07:25:49Z

在Go中,如何将函数的stdout捕获到字符串中?

例如,在Python中,我可以执行以下操作:

realout = sys.stdout
sys.stdout = StringIO.StringIO()
some_function() # prints to stdout get captured in the StringIO object
result = sys.stdout.getvalue()
sys.stdout = realout

您可以在Go中执行此操作吗?

trans by 2020-07-25T02:56:10Z

go-如何在Golang中将值列表放入标记中?

Golang与以下python命令等效吗?

import argparse
parser = argparse.ArgumentParser(description="something")
parser.add_argument("-getList1",nargs='*',help="get 0 or more values")
parser.add_argument("-getList2",nargs='?',help="get 1 or more values")

我已经看到flag包允许在Golang中解析参数。但它似乎仅支持String,Int或Bool。如何以这种格式将值列表获取到标志中:

go run myCode.go -getList1 value1 value2 
trans by 2020-07-24T23:25:46Z

验证-在Go中验证结构的惯用方式?

我需要验证结构值是否正确,这意味着我需要单独检查每个字段,这对于少量的小型结构来说很容易,但是我想知道是否有更好的方法。 这就是我现在的做法。

type Event struct {
    Id     int
    UserId int
    Start  time.Time
    End    time.Time
    Title  string
    Notes  string
}

func (e Event) IsValid() error {
    if e.Id <= 0 {
        return errors.New("Id must be greater than 0")
    }
    if e.UserId <= 0 {
        return errors.New("UserId must be greater than 0")
    }
    if e.End <= e.Start {
        return errors.New("End must be after Start")
    }
    if e.Start < time.Now() {
        return errors.New("Cannot create events in the past")
    }
    if e.Title == "" {
        return errors.New("Title cannot be empty")
    }
    return nil
}

这是验证结构中字段值的惯用方式吗? 看起来很麻烦。

trans by 2020-07-24T18:44:53Z

类型转换-如何在Go中将布尔值转换为字符串?

我正在尝试通过使用string(isExist)将名为isExistbool转换为stringtruefalse),但是它不起作用。 Go中惯用的方式是什么?

trans by 2020-07-22T03:03:00Z

测试-使用Gotes跳过一些测试

是否可以跳过/排除使用-run运行的某些测试?

我有大量的集成类型测试,这些调用称为标准go测试编写的rest服务,并使用-run运行。开发新功能时,有时可以跳过某些测试(例如,如果新测试)很有用 该功能尚未部署在测试服务器上,我仍然想运行所有现有测试(那些测试新功能的新测试除外)。

我知道-run,但是我不想指定我要运行的所有测试,那将是一长串。 同时,我无法编写排除测试的正则表达式。

另一个选择是不提交不在同一分支中运行的测试,但是如果我仅指定要排除的内容,则会更容易。

trans by 2020-07-21T17:25:09Z

去-有没有办法从一个字符串创建一个结构的实例?

给定一个结构:

type MyStruct struct {
    A int
    B int
}

以及带有结构名称的字符串

a := "MyStruct"

要么

a := "mypkg.MyStruct"

如何从字符串名称而不是结构创建结构的实例? 我的想法是,我将使用链接到二进制文件的所有结构创建一个应用程序,但根据字符串创建运行时实例。 (某种元元)

trans by 2020-07-21T00:29:44Z

指针-隐藏nil值,了解golang为什么失败h

在这种情况下,我无法理解如何正确确保某些东西不是nil

package main

type shower interface {
  getWater() []shower
}

type display struct {
  SubDisplay *display
}

func (d display) getWater() []shower {
  return []shower{display{}, d.SubDisplay}
}

func main() {
  // SubDisplay will be initialized with null
  s := display{}
  // water := []shower{nil}
  water := s.getWater()
  for _, x := range water {
    if x == nil {
      panic("everything ok, nil found")
    }

    //first iteration display{} is not nil and will
    //therefore work, on the second iteration
    //x is nil, and getWater panics.
    x.getWater()
  }
}

我发现检查该值是否实际上是nil的唯一方法是使用反射。

这真的是想要的行为吗? 还是在代码中看不到一些重大错误?

在此处播放链接

trans by 2020-07-21T00:05:24Z

数组-golang append()已评估但未使用

func main(){
     var array [10]int
     sliceA := array[0:5]
     append(sliceA, 4)
     fmt.Println(sliceA)
}

错误:已评估但未使用append(sliceA,4)

不知道为什么 切片附加操作未运行...

trans by 2020-07-19T11:14:06Z

Windows-exec:“ gcc”:尝试执行构建时,在%PATH%中找不到可执行文件

我正在使用Windows10。当我尝试构建Chaincode时,它报告了此错误。

# github.com/hyperledger/fabric/vendor/github.com/miekg/pkcs11 
exec: "gcc": executable file not found in %PATH%

我的chaincode导入:

import (
    "fmt"
    "strconv"

    "github.com/hyperledger/fabric/core/chaincode/shim"
    pb "github.com/hyperledger/fabric/protos/peer"
)

在Docker中运行良好。

trans by 2020-07-10T18:12:58Z

Go中的功能和方法有何不同?

我正在尝试开始使用Go,并且文档非常好。 我在文档中找不到的是函数和方法之间的区别。

据我目前的了解:函数是“全局”的,这意味着我不必导入包即可使用函数,它们始终存在。 方法绑定到包。 这样对吗?

trans by 2020-07-10T11:33:53Z

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 下一页 共38页