相关疑难解决方法(0)

在go中查找constant的地址

我们编写了一个程序,通过它我们试图找到一个常量的地址.有可能这样做吗?

package main

func main() {
        const k = 5
        address := &k
}
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误,任何人都可以告诉我们如何找到常量的地址?

pointers constants go

13
推荐指数
2
解决办法
8069
查看次数

为什么这两个float64具有不同的值?

考虑这两种情况:

fmt.Println(912 * 0.01)
fmt.Println(float64(912) * 0.01)
Run Code Online (Sandbox Code Playgroud)

(去游乐场链接)

第二个打印9.120000000000001,这实际上很好,我明白为什么会这样.

但是,为什么第一行打印9.12,最后没有... 01?Go是否将两个无类型常量相乘,并在编译时简单地用9.12文字替换它们?

floating-point floating-accuracy go

9
推荐指数
2
解决办法
444
查看次数

将10的幂写为紧凑的常数

我正在阅读最近发布的The Go编程语言,到目前为止它一直是一种喜悦(Brian Kernighan是作者之一,无论如何我都不会期待任何其他事情).

我在第3章遇到了以下练习:

练习3.13const尽可能紧凑地 写入KB,MB,直到YB的声明.

(注意:在此上下文中,KB,MB等表示1000的幂)

这之前是一个iota作为有用的常量生成器机制引入的部分; 特别是,前一段显示了将1024的幂定义为常量的简洁方法:

const (
    _ = 1 << (10 * iota)
    KiB
    MiB
    GiB
    TiB
    PiB
    EiB
    ZiB
    YiB
)
Run Code Online (Sandbox Code Playgroud)

作者进一步提到了10的权力:

iota机制有其局限性.例如,由于没有取幂运算符,因此无法生成更熟悉的1000(KB,MB等)的幂.

我正在努力进行这项练习,因为看起来预期的解决方案比仅仅手动拼写1000的功能更为精细(特别是因为它出现之后iota).我觉得有一些聪明的方法可以用iota微妙的方式结合其他东西.

我想找到一种系统的方法来从1024的每个幂中减去"超额"量来获得1000的幂,但它让我无处可去.然后我查看二进制表示来尝试推断iota可能有用的一般模式,但同样,我什么也没得到.

我真的看不出如何在iota没有指数运算符的情况下从单个递增值()中产生1000 的幂.

有任何想法吗?

const go iota

7
推荐指数
2
解决办法
1345
查看次数

为什么0.1 + 0.2在Google Go中获得0.3?

只要使用浮点数,0.1就不能在内存中精确表示,所以我们知道这个值通常是0.10000000000000004.

但是当使用go时加0.1和0.2.我得到0.3.

fmt.Println(0.1 + 0.2)
// Output : 0.3
Run Code Online (Sandbox Code Playgroud)

为什么0.3出来而不是0.30000000000000004?

precision go

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

Golang:on-purpose int overflow

我正在使用哈希函数murmur2返回给我一个uint64.

我想将它存储在PostgreSQL中,它只支持BIGINT(带符号64位).

因为我对数字本身不感兴趣,只是对二进制值感兴趣(因为我将它用作检测唯一性的id(我的值为~1000值,64位散列对我来说足够了)我想int64通过"只是"改变类型将其转换为.

如何以一种令编译器满意的方式做到这一点?

integer-overflow type-conversion go

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

Go如何对常量执行算术运算?

我一直在阅读关于Go中常量的这篇文章,我试图理解它们是如何在内存中存储和使用的.您可以在Go中对非常大的常量执行操作,只要结果适合内存,您就可以将结果强制转换为类型.例如,10正如您所期望的那样打印此代码:

const Huge = 1e1000
fmt.Println(Huge / 1e999)
Run Code Online (Sandbox Code Playgroud)

这是如何工作的?在某些时候,Go必须存储1e10001e999在内存中,以便对它们执行操作.那么常量如何存储,以及Go如何对它们进行算术运算?

const go

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

当作为方法 arg 传递时,无类型常量 '\n' 如何转换为字节?

我正在观看 FOSDEM '17 上关于在 Go 中实现“tail -f”的演讲 => https://youtu.be/lLDWF59aZAo

在作者最初的示例程序中,他Reader使用文件句柄创建了一个文件,然后使用ReadString带有分隔符“\n”的方法逐行读取文件并打印其内容。我通常使用Scanner,所以这对我来说是新的。

程序如下 | 去游乐场链接

package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
)

func main() {
    fileHandle, err := os.Open("someFile.log")
    if err != nil {
        log.Fatalln(err)
        return
    }
    defer fileHandle.Close()

    reader := bufio.NewReader(fileHandle)

    for {
        line, err := reader.ReadString('\n')
        if err != nil {
            log.Fatalln(err)
            break
        }
        fmt.Print(line)
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,ReadString采用一个字节作为其分隔符参数[ https://golang.org/pkg/bufio/#Reader.ReadString]

所以我的问题是,到底是如何将 '\n'(即 a )rune转换为 a 的byte?我无法理解这个问题。特别是因为byte …

go

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

将int转换为byte

var x uint64 = 257
var y int = 257
fmt.Println("rv1 is ", byte(x))        // ok
fmt.Println("rv2 is ", byte(y))        // ok
fmt.Println("rv3 is ", byte(257))      // constant 257 overflows byte
fmt.Println("rv4 is ", byte(int(257))) // constant 257 overflows byte 
Run Code Online (Sandbox Code Playgroud)

它很奇怪.

所有这些都将int转换为byte,因此所有这些都应该是错误的.

但案例1,2还可以!

怎么可能?

go

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

在Go中将uint16转换为int16的正确方法

按位操作和Go newbie在这里:DI正在使用Go从传感器读取一些数据,我将其作为2个字节 - 比方说0xFFFE.很容易把它转换为uint16,因为在Go中我们可以做uint16(0xFFFE)但我需要的是将它转换为整数,因为传感器实际上返回范围从-32768到32767.现在我想"也许Go会是这个很好,如果我这样做int16(0xFFFE)会明白我想要的吗?" , 但不是.我最终使用了以下解决方案(我从网上翻译了一些python代码):

x := 0xFFFE

if (x & (1 << 15)) != 0 {
    x = x - (1<<16)
}
Run Code Online (Sandbox Code Playgroud)

它似乎工作,但A)我不完全确定为什么,和B)它看起来有点难看,我想象应该是一个简单的解决方案,将uint16转换为int16.任何人都可以帮我一把,并澄清为什么这只是这样做的方法?或者还有其他可行的方法吗?

bit-manipulation go uint16

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

如何以正确的方式将float64数字更改为uint64?

package main

func main() {
    var n float64 = 6161047830682206209
    println(uint64(n))
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

6161047830682206208
Run Code Online (Sandbox Code Playgroud)

看起来当float64改变时uint64,分数被丢弃.

floating-point type-conversion go floating-point-conversion

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

Go允许算术运算溢出而不是抛出异常是预期的行为吗?

我正在将一些Go代码移植到Rust,我意识到在乘法过程中发生溢出时Rust会慌乱,而Go允许溢出发生。

下面的测试代码不会引起溢出,但是会打印出减少的值。(通过以下网址测试:https : //play.golang.org/

func main() {
    fmt.Println("test\n")
    var key uint64 = 15000;

    key = key*2862933555777941757 + 1

    fmt.Println(key)
}
Run Code Online (Sandbox Code Playgroud)

integer-overflow go

-3
推荐指数
1
解决办法
111
查看次数