小编icz*_*cza的帖子

Golang,下面是做什么的[]

我是 golang 的新手,有一个基本问题。我从网上的一个例子中提取了以下代码

func (d Direction) String() string {
    return [...]string{"North", "East", "South", "West"}[d]
}
Run Code Online (Sandbox Code Playgroud)

我很困惑[d]方法体中的作用是什么?

arrays go composite-literals

0
推荐指数
1
解决办法
97
查看次数

go vet - 我由 func 文字捕获的循环变量

在下面的代码中:

package main

import "fmt"

func main() {
    for i := 0; i <= 9; i++ {
        go func() {
            fmt.Println(i)
        }()
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

code$ 
code$ go install github.com/myhub/cs61a
code$ bin/cs61a 
code$ 
Run Code Online (Sandbox Code Playgroud)

以上程序不提供任何输出。

1)他们是否i在 10 个 go-routines 之间进行单一内存位置的数据竞争?

2)为什么上面的代码不打印自由变量的值i

concurrency loops go goroutine

0
推荐指数
1
解决办法
1232
查看次数

如何使用加密/rc4

我正在尝试使用 RC4 在 Go 中加密/解密一些数据。我发现 Go 在 crypto/rc4 包中提供了 rc4 算法。我尝试使用该包加密/解密数据,但密文和解密的明文不是我所期望的。

我RC4在线工具像比较这个,但我敢肯定,Go的RC4包有一些问题。因为在我用 Go rc4 加密明文并解密密文后,解密的明文'不是我加密的。我应该找其他图书馆吗?

我运行的代码是这样的。

package main

import (
    "crypto/rc4"
    "fmt"
    "log"
)

func main() {
    c, err := rc4.NewCipher([]byte("dsadsad"))
    if err != nil {
        log.Fatalln(err)
    }
    src := []byte("asdsad")
    dst := make([]byte, len(src))
    fmt.Println("Plaintext: ", src)
    c.XORKeyStream(dst, src)
    c.XORKeyStream(src, dst)
    fmt.Println("Ciphertext: ", dst)
    fmt.Println("Plaintext': ", src)
}
Run Code Online (Sandbox Code Playgroud)

输出是这样的

Plaintext:  [97 115 100 115 97 100]
Ciphertext:  [98 41 227 117 93 79]
Plaintext':  [111 154 128 …
Run Code Online (Sandbox Code Playgroud)

encryption go rc4-cipher

0
推荐指数
1
解决办法
472
查看次数

追加时不会使数组大小加倍

为了

package main

import "fmt"

func main() {


    b := make([]int, 1, 5)  
    printSlice("b", b[:cap(b)])
    
    b2 := append(b, 1)
    b3 := append(b2, 1)
    b4 := append(b3, 1)
    b5 := append(b4, 1)
    
    printSlice("bbbb", b5[:cap(b5)])
    
    b6 := append(b5, 1)
    
    printSlice("bbbb", b6[:cap(b6)])
    
    
}

func printSlice(s string, x []int) {
    fmt.Printf("%s len=%d cap=%d %v\n",
        s, len(x), cap(x), x)
}
Run Code Online (Sandbox Code Playgroud)

结果是

b len=5 cap=5 [0 0 0 0 0]
bbbb len=5 cap=5 [0 1 1 1 1]
bbbb len=10 cap=10 [0 1 1 1 1 …
Run Code Online (Sandbox Code Playgroud)

go slice

0
推荐指数
1
解决办法
93
查看次数

使用 add 运算符连接字符串时,Go 变量转义到堆

关于此代码的问题。为什么变量逃逸到堆

func main() {
    port := "8080"
    host := "localhost:"
    connection := host + port
    fmt.Println(connection)
}
Run Code Online (Sandbox Code Playgroud)

gorun -gcflags "-m -l" main.go

# command-line-arguments
./main.go:12:21: host + port escapes to heap
./main.go:13:13: ... argument does not escape
./main.go:13:13: connection escapes to heap
Run Code Online (Sandbox Code Playgroud)

我发现如果使用fmt.Sprintf它也会导致变量逃逸到堆

stack memory-management heap-memory go escape-analysis

0
推荐指数
1
解决办法
160
查看次数

wg.Add() 放在哪里

var wg sync.WaitGroup
var v int32 = 0 
for i = 0; i < 100; i++{
   go func(){
       wg.Add(1) // wrong place
       atomic.AddInt32(&v,1)
       wg.Done()
   } 
}
wg.Wait()
fmt.Println(v)
Run Code Online (Sandbox Code Playgroud)

这是我从这个视频中看到的一段代码https://subscription.packtpub.com/video/application_development/9781788994880/97598/97608/goroutines

v总是小于100,我认为原因可能是wg.Wait()因为我们放入wg.Add(1)匿名函数并且在同一个 goroutinewg.Done()中将被立即调用,因此 main goroutine 从阻塞状态恢复执行。

但是如果我们将wg.Add(1)放入 for 循环中, v 将始终为100

var wg sync.WaitGroup
var v int32 = 0 
for i = 0; i < 100; i++{
   wg.Add(1)
   go func(){
       atomic.AddInt32(&v,1)
       wg.Done()
   } 
}
wg.Wait()
fmt.Println(v)
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么我们可以保证 …

concurrency go goroutine

0
推荐指数
1
解决办法
592
查看次数

goroutine调用中通道接收操作符的阻塞行为

go DelegateWork(mr, <-mr.impl.readyWorkers, jobArgs)    
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,通道接收操作符是否会导致调用者或被调用的 goroutine 阻塞?

channel go goroutine

0
推荐指数
1
解决办法
54
查看次数

是否可以使用 select 从多个 goroutine 中安全地关闭一次通道?

我的解决方案如下,但是以下代码中是否存在竞争条件(它会出现恐慌)吗?

c := make(chan struct{})

for i := 0; i < 1000000; i++ {
    go func() {
        select {
        case <-c:
        default:
            close(c)
        }
    }()
}
Run Code Online (Sandbox Code Playgroud)

我认为是的,但是 go test -race 没有检测到它,并且根据经验,我无法让它恐慌。

concurrency channel go goroutine

0
推荐指数
1
解决办法
128
查看次数

为什么在函数末尾运行cancelFunc()

当我通过 golang\xef\xbc\x8c 创建上下文 WithCancel 函数时为什么建议在函数末尾运行 cancelFunc\xe3\x80\x82\n我认为 \xef\xbc\x8cassume 我使用 gin 框架,当前函数运行后完成\xef\xbc\x8c gin的上下文会破坏\xe3\x80\x82所以是否有必要在\ndefine之后运行cancelFunc context.WithCancel(ctx)defer cancelFunc()

\n
func myFunction(ctx *context.Context) error {\n    cancelCtx, cancelFunc := context2.WithCancel(ctx)\n    defer cancelFunc()\n\n    var (\n        successTask = int32(0)\n        failTask    = int32(0)\n        wg          = &sync.WaitGroup{}\n    )\n\n    select {\n    case <-cancelCtx.Done():\n        break\n    default:\n        for i := 0; i < 100; i++{\n            wg.add(1)\n\n            go func(){\n                defer wg.Done()\n\n                err := myLogic()\n                if err != nil {\n                    atomic.AddInt32(&failTask, 1)\n                    cancelFunc()\n                    return\n                }\n                atomic.AddInt32(&successTask, 1)\n            }\n        }\n        \n        \n    }\n\n    wg.Wait()\n    return …
Run Code Online (Sandbox Code Playgroud)

go go-gin go-context

0
推荐指数
1
解决办法
86
查看次数

GoLang,如果condtion如何写一个多行语句

我想匹配波纹管a与价值b,c,d,e,f的一次,而不是写多次这样.

我的价值观是:

a = 11
b = 22
c = 33
d = 44
e = 55
f = 66

if a != b && a != c && a != d && a != e && a != f{
    // Do something
} else{
    // Do something else
}
Run Code Online (Sandbox Code Playgroud)

是我的实际工作代码方法.

但是我想写它

if a != b or c or d or e or f {print text}
Run Code Online (Sandbox Code Playgroud)

a值应该在if语句中使用一次.有没有简单的方法?

comparison if-statement go

-1
推荐指数
1
解决办法
1329
查看次数