小编icz*_*cza的帖子

将可变长度数组从 csv 解析为 struct

我有以下设置来解析 csv 文件:

package main

import (
    "fmt"
    "os"
    "encoding/csv"
)

type CsvLine struct {
    Id string
    Array1 [] string
    Array2 [] string
}


func ReadCsv(filename string) ([][]string, error) {

    f, err := os.Open(filename)
    if err != nil {
        return [][]string{}, err
    }
    defer f.Close()

    lines, err := csv.NewReader(f).ReadAll()
    if err != nil {
        return [][]string{}, err
    }
    return lines, nil
}


func main() {

    lines, err := ReadCsv("./data/sample-0.3.csv")
    if err != nil {
        panic(err)
    }

    for _, line := …
Run Code Online (Sandbox Code Playgroud)

csv string go slice

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

sort.Slice 排序不正确

abc := []byte{'a', 'c', 'b'}  
sort.Slice(abc[1:], func(i, j int) bool {
  return abc[i] < abc[j]
})
fmt.Println(string(abc)) //print acb
Run Code Online (Sandbox Code Playgroud)

上面的代码没有abc正确排序。为什么?

sorting go slice

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

如何暂停和恢复 goroutine?

我正在尝试暂停和恢复 groutine。我知道我可以sleep跑步,但我正在寻找就像一个按钮“暂停/恢复”而不是一个计时器。

这是我的尝试。我正在使用通道的阻塞功能来暂停,并select根据通道值切换要执行的内容。但是,输出总是Running在我的情况下。

func main() {
    ctx := wctx{}
    go func(ctx wctx) {
        for {
            time.Sleep(1 * time.Second)
            select {
            case <-ctx.pause:
                fmt.Print("Paused")
                <-ctx.pause
            case <-ctx.resume:
                fmt.Print("Resumed")
            default:
                fmt.Print("Running \n")
            }
        }
    }(ctx)

    ctx.pause <- struct{}{}
    ctx.resume <- struct{}{}
}

type wctx struct {
    pause  chan struct{}
    resume chan struct{}
}
Run Code Online (Sandbox Code Playgroud)

concurrency channel go goroutine

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

为什么我可以从 Go 中的类型调用 f​​unc?

我正在学习围棋,在进行“围棋之旅”时,我发现了以下代码:

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.Now()
    switch {
    case t.Hour() < 12:
        fmt.Println("Good morning!")
    case t.Hour() < 17:
        fmt.Println("Good afternoon.")
    default:
        fmt.Println("Good evening.")
    }
}

Run Code Online (Sandbox Code Playgroud)

我想知道我在做什么,所以我打开了有关“时间”包的文档。

在做时t := time.Now(),根据文档,我得到一个类型 struct Time ( https://golang.org/pkg/time/#Now ),但是,为了得到我们做的小时t.Hour()。我会理解如果 t 是对象 Time 和 Hour 的一个实例,来自该对象的方法,但这不是 oop,并且 t 是一种类型,我希望像time.Hour(t)获取小时一样调用它。

你能告诉我为什么t.Hour()有效吗?

谢谢!/米格尔

methods function go

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

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
查看次数