我们编写了一个程序,通过它我们试图找到一个常量的地址.有可能这样做吗?
package main
func main() {
const k = 5
address := &k
}
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误,任何人都可以告诉我们如何找到常量的地址?
考虑这两种情况:
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文字替换它们?
我正在阅读最近发布的The Go编程语言,到目前为止它一直是一种喜悦(Brian Kernighan是作者之一,无论如何我都不会期待任何其他事情).
我在第3章遇到了以下练习:
练习3.13
const尽可能紧凑地 写入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 的幂.
有任何想法吗?
只要使用浮点数,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?
我正在使用哈希函数murmur2返回给我一个uint64.
我想将它存储在PostgreSQL中,它只支持BIGINT(带符号64位).
因为我对数字本身不感兴趣,只是对二进制值感兴趣(因为我将它用作检测唯一性的id(我的值为~1000值,64位散列对我来说足够了)我想int64通过"只是"改变类型将其转换为.
如何以一种令编译器满意的方式做到这一点?
我一直在阅读关于Go中常量的这篇文章,我试图理解它们是如何在内存中存储和使用的.您可以在Go中对非常大的常量执行操作,只要结果适合内存,您就可以将结果强制转换为类型.例如,10正如您所期望的那样打印此代码:
const Huge = 1e1000
fmt.Println(Huge / 1e999)
Run Code Online (Sandbox Code Playgroud)
这是如何工作的?在某些时候,Go必须存储1e1000并1e999在内存中,以便对它们执行操作.那么常量如何存储,以及Go如何对它们进行算术运算?
我正在观看 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 …
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 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.任何人都可以帮我一把,并澄清为什么这只是这样做的方法?或者还有其他可行的方法吗?
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,分数被丢弃.
我正在将一些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)