我是 golang 的新手,有一个基本问题。我从网上的一个例子中提取了以下代码
func (d Direction) String() string {
return [...]string{"North", "East", "South", "West"}[d]
}
Run Code Online (Sandbox Code Playgroud)
我很困惑[d]方法体中的作用是什么?
在下面的代码中:
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?
我正在尝试使用 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) 为了
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) 关于此代码的问题。为什么变量逃逸到堆
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它也会导致变量逃逸到堆
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)
我的问题是为什么我们可以保证 …
go DelegateWork(mr, <-mr.impl.readyWorkers, jobArgs)
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,通道接收操作符是否会导致调用者或被调用的 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 没有检测到它,并且根据经验,我无法让它恐慌。
当我通过 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()
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) 我想匹配波纹管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语句中使用一次.有没有简单的方法?
go ×10
goroutine ×4
concurrency ×3
channel ×2
arrays ×1
comparison ×1
encryption ×1
go-context ×1
go-gin ×1
heap-memory ×1
if-statement ×1
loops ×1
rc4-cipher ×1
slice ×1
stack ×1