小编sam*_*mol的帖子

如何声明常量贴图

我试图在Go中声明为常量,但它正在抛出一个错误.有人可以帮我解决在Go中声明常量的语法吗?

这是我的代码:

const romanNumeralDict map[int]string = {
  1000: "M",
  900 : "CM",
  500 : "D",
  400 : "CD",
  100 : "C",
  90  : "XC",
  50  : "L",
  40  : "XL",
  10  : "X",
  9   : "IX",
  5   : "V",
  4   : "IV",
  1   : "I",
}
Run Code Online (Sandbox Code Playgroud)

这是错误

# command-line-arguments
./Roman_Numerals.go:9: syntax error: unexpected {
Run Code Online (Sandbox Code Playgroud)

go

107
推荐指数
4
解决办法
10万
查看次数

如何用它的值对Map [string] int进行排序?

鉴于此代码块

map[string]int {"hello":10, "foo":20, "bar":20}
Run Code Online (Sandbox Code Playgroud)

我想打印出来

foo, 20
bar, 20
hello, 10
Run Code Online (Sandbox Code Playgroud)

按从高到低的顺序

谢谢!

go

70
推荐指数
4
解决办法
3万
查看次数

如何在Golang中使用RWMutex?

type Stat struct {
    counters     map[string]*int64
    countersLock sync.RWMutex
    averages     map[string]*int64
    averagesLock sync.RWMutex
}
Run Code Online (Sandbox Code Playgroud)

它在下面称为

func (s *Stat) Count(name string) {
    s.countersLock.RLock()
    counter := s.counters[name]
    s.countersLock.RUnlock()
    if counter != nil {
        atomic.AddInt64(counter, int64(1))
        return
    }
}
Run Code Online (Sandbox Code Playgroud)

我的理解是我们首先锁定接收器s(这是一个类型Stat),然后如果计数器存在则我们添加它.

问题:

Q1:为什么我们需要锁定它?是什么RWMutex,甚至什么意思?

Q2:s.countersLock.RLock()- 这会锁定整个接收器还是只锁定Stat类型的计数器字段?

问题3:s.countersLock.RLock()- 这会锁定平均值字段吗?

Q4:我们为什么要使用RWMutex?我认为channel是在Golang中处理并发的首选方式?

Q5:这是什么atomic.AddInt64.在这种情况下,为什么我们需要原子?

问题6:为什么我们会在添加之前解锁?

go

48
推荐指数
3
解决办法
4万
查看次数

WebSocket:如何在它死后自动重新连接

var ws = new WebSocket('ws://localhost:8080');
ws.onopen = function () {
  ws.send(JSON.stringify({
      .... some message the I must send when I connect ....
  }));

};

ws.onmessage = function (e) {
  console.log('Got a message')
  console.log(e.data);
};

ws.onclose = function(e) {  
  console.log('socket closed try again'); 

}

ws.onerror = function(err) {
  console.error(err)
};
Run Code Online (Sandbox Code Playgroud)

当我第一次连接到套接字时,我必须首先向服务器发送消息以验证自己并订阅频道.

我遇到的问题是,有时套接字服务器不可靠,并触发对象的事件onerroronclose事件'ws'.

问题:什么是一个好的设计模式,允许我,无论何时套接字关闭或遇到错误,等待10秒然后重新连接到套接字服务器(并重新发送到服务器的初始消息)

javascript websocket

37
推荐指数
3
解决办法
4万
查看次数

是否有一种简单的方法可以在测试期间将golang()全局发送到全局.

我们的部分代码是时间敏感的,我们需要能够预留一些东西然后在30-60秒内释放它们,我们可以做一个 time.Sleep(60 * time.Second)

我刚刚实现了时间接口,并且在测试期间使用了时间接口的存根实现,类似于这个golang-nuts讨论.

然而,time.Now()在多个站点中调用,这意味着我们需要传递一个变量来跟踪我们实际睡了多少时间.

我想知道是否有另一种方法可以在time.Now()全球范围内存根.也许进行系统调用来改变系统时钟?

也许我们可以编写自己的时间包,它基本上包裹时间包但允许我们改变它?

我们目前的实施工作很好,我是一个初学者,我很想知道是否有人有其他想法?

unit-testing go

34
推荐指数
7
解决办法
3万
查看次数

如何反转排序整数Go?

我试图在Go中对一片整数进行反向排序.

  example := []int{1,25,3,5,4}
  sort.Ints(example) // this will give me a slice sorted from 1 to the highest number
Run Code Online (Sandbox Code Playgroud)

如何对其进行排序以使其从最高到最低?所以[25 5 4 3 1]

我试过这个

sort.Sort(sort.Reverse(sort.Ints(keys)))
Run Code Online (Sandbox Code Playgroud)

资料来源:http://golang.org/pkg/sort/#Reverse

但是,我收到以下错误

# command-line-arguments
./Roman_Numerals.go:31: sort.Ints(keys) used as value
Run Code Online (Sandbox Code Playgroud)

go

30
推荐指数
3
解决办法
2万
查看次数

如何按顺序遍历golang中的地图?

请看下面我的地图

var romanNumeralDict map[int]string = map[int]string{
  1000: "M",
  900 : "CM",
  500 : "D",
  400 : "CD",
  100 : "C",
  90  : "XC",
  50  : "L",
  40  : "XL",
  10  : "X",
  9   : "IX",
  5   : "V",
  4   : "IV",
  1   : "I",
}
Run Code Online (Sandbox Code Playgroud)

我希望按照键的大小顺序遍历此映射

  for k, v := range romanNumeralDict {
    fmt.Println("k:", k, "v:", v)
  }
Run Code Online (Sandbox Code Playgroud)

然而,这打印出来

k: 1000 v: M
k: 40 v: XL
k: 5 v: V
k: 4 v: IV
k: 900 v: CM
k: …
Run Code Online (Sandbox Code Playgroud)

go

29
推荐指数
2
解决办法
4万
查看次数

在查询中连接复合外键/主键列的表

CREATE TABLE subscription (
   magazine_id bigint,
   user_id     bigint,
   PRIMARY KEY (magazine_id, user_id)
);

CREATE TABLE delivery (
   magazine_id bigint,
   user_id     bigint,
   FOREIGN KEY (subscription) REFERENCES subscription (magazine_id, user_id)
);
Run Code Online (Sandbox Code Playgroud)

在给定特定订阅的情况下查询交付的好方法是什么?有没有办法为列名PRIMARY KEY (magazine_id, user_id)和相应的外键分配列名,以便我可以像这样查询

SELECT *
FROM subscription
JOIN delivery ON (delivery.subscription_fk = delivery.subscription_pk);
Run Code Online (Sandbox Code Playgroud)

注意:我可以写这样的东西:

SELECT *
FROM subscription
JOIN delivery ON (delivery.magazine_id = subscription.magazine_id
              AND delivery.user_id = subscription.user_id);
Run Code Online (Sandbox Code Playgroud)

但是,我的印象是,实现这一目标的方式不那么冗长.

sql postgresql join natural-join

21
推荐指数
1
解决办法
2万
查看次数

Rails ActiveRecord :: Migration index:true和add_index有什么区别?

有什么区别

t.boolean :is_live, index: true
Run Code Online (Sandbox Code Playgroud)

add_index :table_name, :is_live
Run Code Online (Sandbox Code Playgroud)

如果没有区别,那么为什么只能add_index在schema.rb中反映出来.当我使用时index: true,我实际上无法看到索引schema.rb.我应该只使用这种add_index方法.

使用该add_index方法时,我可以在schema.rb中看到这一点

add_index "table_name", ["is_live"], name: "index_table_name_on_is_live", using: :blahblah
Run Code Online (Sandbox Code Playgroud)

migration activerecord rails-migrations

20
推荐指数
2
解决办法
6832
查看次数

:= Golang中的运算符和if语句

以下用作打开文件的功能

func openFile(filename string) {
  var file *os.File
  var err error
  if file, err = os.Open(filename); err != nil {
    log.Printf("Failed to open the file: %s.", filename)
    return
  }
  defer file.Close()
  // blahblahblah
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用:=来声明变量文件时,这不起作用

func updateFrequencies(filename string, frequencyForWord map[string]int) {
  if file, err := os.Open(filename); err != nil {
     ....
  }
}
Run Code Online (Sandbox Code Playgroud)

错误:./ word_frequencies_2.go:30:undefined:file

但是,如果我稍微改变一下,这是有效的

file, err := os.Open(filename)
if err != nil {
   log.Printf("Failed to open the file: %s.", filename)
   return
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能使用:=作为if语句的一部分?

go

19
推荐指数
2
解决办法
2万
查看次数