小编icz*_*cza的帖子

JSON 嵌套动态结构 Go 解码

有一个关于输入数据的示例。

\n\n
{\n    "status": "OK",\n    "status_code": 100,\n    "sms": {\n        "79607891234": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        },\n        "79035671233": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        },\n        "79105432212": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        }\n    },\n    "balance": 2676.18\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
{\n    "status": "OK",\n    "status_code": 100,\n    "sms": {\n        "79607891234": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        },\n        "79035671233": {\n            "status": "ERROR",\n            "status_code": 203,\n            "status_text": "\xd0\x9d\xd0\xb5\xd1\x82 \xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xbe\xd0\xbe\xd0\xb1\xd1\x89\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f"\n        },\n        "79105432212": {\n            "status": "ERROR",\n            "status_code": …
Run Code Online (Sandbox Code Playgroud)

json struct go

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

Go 生成的动画 GIF 在 Windows 中不起作用

我发现一个示例在 Windows 中无法正常工作。该程序演示了 Go 标准图像包的基本用法,我们将使用它来创建位图图像序列,然后将该序列编码为 GIF 动画。

package main

import (
    "image"
    "image/color"
    "image/gif"
    "io"
    "math"
    "math/rand"
    "os"
)

import (
    "log"
    "net/http"
    "time"
)

//!+main

var palette = []color.Color{color.White, color.Black}

const (
    whiteIndex = 0 // first color in palette
    blackIndex = 1 // next color in palette
)

func main() {
    //!-main
    // The sequence of images is deterministic unless we seed
    // the pseudo-random number generator using the current time.
    // Thanks to Randall McPherson for pointing …
Run Code Online (Sandbox Code Playgroud)

image file gif go

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

如何使用map [string] * string

我正在尝试使用sarama(管理员模式)创建主题。如果没有ConfigEntries,则可以正常运行。但是我需要定义一些配置。

我设置了主题配置(这里发生了错误):

    tConfigs := map[string]*string{
        "cleanup.policy":      "delete",
        "delete.retention.ms": "36000000",
    }
Run Code Online (Sandbox Code Playgroud)

但是然后我得到一个错误:

./main.go:99:28: cannot use "delete" (type string) as type *string in map value
./main.go:100:28: cannot use "36000000" (type string) as type *string in map value
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用这样的管理模式:

err = admin.CreateTopic(t.Name, &sarama.TopicDetail{
    NumPartitions:     1,
    ReplicationFactor: 3,
    ConfigEntries:     tConfigs,
}, false)
Run Code Online (Sandbox Code Playgroud)

这是sarama模块中定义CreateTopic()的代码行, 网址为https://github.com/Shopify/sarama/blob/master/admin.go#L18

基本上,我不了解指针字符串的映射是如何工作的:)

string dictionary pointers go sarama

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

使用iota定义const变量时如何跳过很多值?

说我有下一个C程序:

#include <stdio.h>

int main(int args, char* argv[])
{
    enum RC {
        APPLE=0,
        ORANGE,
        PEAR,
        BANANA=99,
        GRAPE
    };

    printf("%d, %d, %d, %d, %d\n", APPLE, ORANGE, PEAR, BANANA, GRAPE);
}
Run Code Online (Sandbox Code Playgroud)

输出为:

0、1、2、99、100

如果进行中,如何使用a more golang way来处理呢?

实际上,如果我只是想跳过一些值。例如print 0, 1, 2, 5, 6,那么我可以使用next跳过一些值,但是在这里我需要跳过96个值...

package main

import "fmt"

func main() {
    const (
        APPLE = iota
        ORANGE
        PEAR
        _
        _
        BANANA
        GRAPE
    )
    fmt.Println(APPLE, ORANGE, PEAR, BANANA, GRAPE)
}
Run Code Online (Sandbox Code Playgroud)

并且,我也可以使用next,但是在GRAPE... 之后我仍然有很多const变量。

package main

import "fmt"

func main() {
    const …
Run Code Online (Sandbox Code Playgroud)

enums const go iota

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

如果 GOMAXPROCS 太大怎么办?

我们都知道runtime.GOMAXPROCS默认设置为CPU核心数,如果这个属性设置过大怎么办?

  1. 程序会有更多的上下文切换吗?
  2. 垃圾收集器会更频繁地触发吗?

performance garbage-collection go

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

为什么种族探测器没有检测到这种种族状况?

我目前正在学习Go编程语言,现在正在尝试原子包。

在此示例中,我产生了许多Goroutine,它们都需要增加包级变量。有几种避免竞争情况的方法,但是现在我想使用atomic软件包解决此问题。

在Windows PC(go run main.go)上运行以下代码时,结果不是我期望的结果(我希望最终结果是1000)。最终数字在900到1000之间。在Go Playground中运行代码时,该值为1000。

这是我正在使用的代码:https : //play.golang.org/p/8gW-AsKGzwq

var counter int64
var wg sync.WaitGroup

func main() {
    num := 1000
    wg.Add(num )
    for i := 0; i < num ; i++ {
        go func() {
            v := atomic.LoadInt64(&counter)
            v++
            atomic.StoreInt64(&counter, v)

            // atomic.AddInt64(&counter, 1)

            // fmt.Println(v)
            wg.Done()
        }()
    }
    wg.Wait()
    fmt.Println("final", counter)
}
Run Code Online (Sandbox Code Playgroud)
go run main.go
final 931

go run main.go
final 960

go run main.go
final 918
Run Code Online (Sandbox Code Playgroud)

我本来希望比赛检测器会给出错误,但是不会:

go run …
Run Code Online (Sandbox Code Playgroud)

concurrency multithreading go race-condition goroutine

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

初始化自定义类型不适用于var,但适用于:=

我正在尝试初始化ErrNegativeSqrt,它是一个自定义的float64类型,但是如果我这样做,var它将无法正常工作。

看一下func Sqrt(x float64) (float64, error)

package main

import (
    "fmt"
)

type ErrNegativeSqrt float64

func (e *ErrNegativeSqrt) Error() string {
    return fmt.Sprint("cannot Sqrt negative number: %f", float64(*e))
}

func Sqrt(x float64) (float64, error) {
    if x < 0 {
        var err ErrNegativeSqrt = x
        // This works: err := ErrNegativeSqrt(x)
        return x, &err
    }

    z := x / 2
    i := 1

    for prev_z := 0.0; z != prev_z && Abs(z-prev_z) > 0.000000000000001; i++ { …
Run Code Online (Sandbox Code Playgroud)

variables types go

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

无法从 Golang 中的 map[time.Time]Measure 中获取值,if val, ok := mapMeasures[ts]; 好的 {}

我有一个定义如下的地图:

mapMeasures := make(map[time.Time]models.Measure, 0)
Run Code Online (Sandbox Code Playgroud)

type Measure struct {
    Delta         float64      // I just let one field to simplificate
}
Run Code Online (Sandbox Code Playgroud)

所以初始循环将填充值从22/01/20-10:10:00to 22/01/20-12:00:00,因此它将存储 12 个键值(10 分钟时间步长)

然后,它将再次循环这些时间戳,并将增量添加到现有值。

所以,我需要检查是否已经有一个与我的实际时间戳相对应的键:

if val, ok := mapMeasures[ts]; ok { // ts already exists, we must sum delta values
    measure.Delta += val.Delta
}
Run Code Online (Sandbox Code Playgroud)

但似乎这种情况永远不会成立。

我调试了代码,我可以看到时间戳实际上存在于地图中:

 mapMeasures = {map[time.Time]gitlab.com/company/common/models.Measure} 
 0 =  -> 
  key = {time.Time} 2020-01-22 11:40:00 +0100
  value = {*gitlab.com/company/common/models.Measure | 0xc000132460} 
 1 =  -> 
  key = {time.Time} 2020-01-22 12:30:00 +0100
  value …
Run Code Online (Sandbox Code Playgroud)

time hashmap go

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

如果上下文被取消则终止函数执行

我当前的功能最初是不了解上下文的。

func (s *Service) ChunkUpload(r *multipart.Reader) error {
    chunk, err := s.parseChunk(r)
    if err != nil {
        return fmt.Errorf("failed parsing chunk %w", err)
    }

    if err := os.MkdirAll(chunk.UploadDir, 02750); err != nil {
        return err
    }

    if err := s.saveChunk(chunk); err != nil {
        return fmt.Errorf("failed saving chunk %w", err)
    }

    return nil
}
Run Code Online (Sandbox Code Playgroud)

我已经更新了它的方法调用,现在将 acontext.Context作为其第一个参数。我的主要目标是在上下文取消后立即终止并返回函数。

我最初的实现是这样的。

func (s *Service) ChunkUpload(ctx context.Context, r *multipart.Reader) error {
    errCh := make(chan error)

    go func() {
        chunk, err := s.parseChunk(r)
        if …
Run Code Online (Sandbox Code Playgroud)

channel go cancellation

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

为映射键分配了多少内存?即 map[uint16]uint16 是每个键 2 个字节还是存储为 uint32/64 无论如何?

我想知道 uint8 或 uint16 Go 映射键是否将存储为 1/2 字节,或者它们将具有 uint32/64 内存分配,而不管指定较小的值?

memory dictionary go

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