小编Fli*_*mzy的帖子

等待互斥锁而不获取它

我一直在编写一个小型微服务,因此熟悉 Go 及其并发机制。

在我的程序中,我有一个具有状态的结构,我想同步该状态,以便多个 goroutine 能够读取它,但不能在另一个 goroutine 更新该状态时进行。

最初我认为 RWMutax 是我需要的,但是根据文档,只有一个 goroutine 可以在任何给定的时刻获得读锁。我要走这条线:

“如果一个 goroutine 持有一个用于读取的 RWMutex,而另一个 goroutine 可能会调用 Lock,那么在初始读锁被释放之前,任何 goroutine 都不应该期望能够获得一个读锁。”

有没有办法在不获取锁的情况下等待互斥锁?

类似的东西:

type stateful struct {
    state        int
    stateMutex   sync.Mutex
    beingUpdated bool
}

type Stateful interface {
    GetState() int
    SetState(st int)
}

func createStateful (sa string) stateful {
    return server{state: 0, stateMutex: sync.Mutex{}, beingUpdated: false}
}

func (s *stateful) SetState(st int) {
    s.stateMutex.Lock()
    s.beingUpdated = true
    s.state = st
    s.beingUpdated = false
    s.stateMutex.Unlock()
}

func (s *stateful) GetState() …
Run Code Online (Sandbox Code Playgroud)

concurrency mutex go

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

类型转换规则 - 将类型转换为其基础类型

在将一个对象(type1)成员复制到另一个对象(type2)成员的过程中进入以下场景:

package main

import "fmt"

type SomeType string

func main() {
    source := SomeType("abc")
    dest := string(source) // this works 
    fmt.Println(dest)
}
Run Code Online (Sandbox Code Playgroud)

对于这种类型转换(string(source)),应用了 Go 规范中的哪个规则,以转换为基础类型?

go

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

如何调试“语法错误:{之前意外的分号或换行符”?

package main

import"fmt"

func main()
{
  firstnu :34
  secondnu :50
  fmt.println("The sum is :", a + b)
}
Run Code Online (Sandbox Code Playgroud)

go

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

在执行 Marshal 和 Unmarshal 时,JSON 字段名称的大小写是否重要?

Marshal 和 Unmarshal 函数是否严格区分大小写?

以下结构定义了票证:

    type TicketInfo struct {
         TicketKey                  string `json:"ticketKey"`       
         Ticketextnum               string `json:"ticketextnum"`        
         TicketDate                 string `json:"ticketDate"`      
         TicketDesc                 string `json:"ticketDesc"`
    }       
Run Code Online (Sandbox Code Playgroud)

此 json 的字符串化形式将作为源系统 API 调用有效负载中的单个参数传递。例如,如果源系统为第一个字段发送“TicketKey”而不是“ticketKey”会发生什么。json.Marshal 会正确接收到 ticketKey 字段吗?

go

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

如何返回整数字节数组中的最后一个元素

在Go中,我想在整数数组中找到最后一个元素。

我有一个清单:

    [0.0.1, 0.0.2, 0.0.3]
Run Code Online (Sandbox Code Playgroud)

我只是想:

    0.0.3
Run Code Online (Sandbox Code Playgroud)

每次我尝试返回最后一个元素时,控制台都会返回

    %!(EXTRA uint8=10)
Run Code Online (Sandbox Code Playgroud)

我认为这意味着我需要将字节数组转换为切片?

这是我的代码:

    [0.0.1, 0.0.2, 0.0.3]
Run Code Online (Sandbox Code Playgroud)

这是输出:

Variable Type:
[]uint8

Variable:
0.0.1
0.0.2
0.0.3

release version:%!(EXTRA uint8=10)
Run Code Online (Sandbox Code Playgroud)

arrays go slice

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

循环遍历 Golang 中的每个字符

我在 Go 中有一个可变字符串。如何检查当前字符是否等于下一个字符?

我的代码是这样的,但仍然错误:

   message := "hhappy"

    for i, v := range message {
      if v[i] == v[i+1] {
        //print something
      }
    }
Run Code Online (Sandbox Code Playgroud)

loops go

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

将MD5从node.js移植到go

我在node.js中有一个身份验证逻辑

var crypto = require('crypto');

var SaltLength = 9;

function createHash(password) {
  var salt = generateSalt(SaltLength);
  var hash = md5(password + salt);
  return salt + hash;
}

function validateHash(hash, password) {
  var salt = hash.substr(0, SaltLength);
  var validHash = salt + md5(password + salt);
  return hash === validHash;
}

function generateSalt(len) {
  var set = '0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ',
      setLen = set.length,
      salt = '';
  for (var i = 0; i < len; i++) {
    var p = Math.floor(Math.random() * setLen); …
Run Code Online (Sandbox Code Playgroud)

javascript authentication md5 go node.js

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

标签 统计

go ×7

arrays ×1

authentication ×1

concurrency ×1

javascript ×1

loops ×1

md5 ×1

mutex ×1

node.js ×1

slice ×1