Go语言101 : 一本侧重于Go语言语法和语义的编程解释和指导书
3640
82
376

更新qr code 。

因为正式群已满100人,目前需要群内成员邀请好友方式才能入群。
有意入群者请暂时扫描下面的临时群二维码。
本人稍后将加好友入正式群。

Github图床二维码: https://raw.githubusercontent.com/wiki/golang101/golang101/go101-group-qr-2022-12-05.png
(如https被墙,请clone git@github.com:golang101/golang101.wiki.git 或者 https://github.com/golang101/golang101.wiki.git 至本地并找到最新的二维码图片)

暂行群规:

1. 尽量不要发Go无关话题;
1. 不要发盗版资源;
1. 一般请不要发广告,招聘等;
1. 尽量不要无谓发言发大水扫屏。

违规一次发红包(10元加)。不愿发或者第二次违规踢出群。谢各位多合作。

代码如下:

func addPrefixes2(prefixStr string, bss [][]byte) {
	var prefix = []byte(prefixStr)
	fmt.Println(len(prefix), cap(prefix)) // -> 2, 32   // line 3
	for i, bs := range bss {
		bss[i] = append(append([]byte{}, prefix...), bs...)
	}
	// fmt.Printf("prefix: %s\nprefix: %#v\n", prefix, prefix)  // line 7
	// len(prefix), cap(prefix) -> 2, 8
}

line3 输出 2, 32
取消line 7 注释后,line3 输出 2, 8
想不明白,求大佬指教

此处打印内容冗余,未在代码中体现。

Go Optimizations 101 里面说内联函数访问和操作包级变量数组会影响性能。
我试了下输出了汇编,发现内联函数出现了循环LEAQ的情况,不内联的函数直接一次LEAQ到寄存器。
然后我尝试通过
rLocal, sLocal:= r,s
inlineAble(&rLocal, &sLocal)
Benchmark_local_inlined-16 16949463 71.09 ns/op
Benchmark_not_inlined-16 17925751 68.53 ns/op
貌似性能还行,这边是为啥?

老兄,干货 Go Optimizations 101 打算上中文吗 :D

谢谢作者为大家提供了这么好的学习资料!
提个建议:每一页文档的底部增加”上一篇“和”下一篇“的链接,方便导航

var x int = 123 // 包级变量

请问可以增加一个页面日间效果和夜间效果的转换吗

你好,文中有提到
image
其中"仅在新值和旧值不相等的情况下才会执行修改操作"个人感觉不太好理解

根据golang文档
image
image
理解为: 在保证*addr与old相等时交换为new并返回true, 是否交换与new的值没有关系

作者,你好!

我写了一个 VuePress 的主题(VuePress Theme Mix),为了方便用户快速使用该主题,我打算建一个使用了该主题组织文档的 GitHub Template 仓库,对于这个文档模板的示例文档内容,我想使用 Go101 的中英文内容,并且会在首页注明内容来源。

请问这样可以吗?

长难句。

下面这个例子验证了上述第一个和第二个事实。
package main

import "fmt"

func main() {
type Person struct {
name string
age int
}
persons := [2]Person {{"Alice", 28}, {"Bob", 25}}
for i, p := range persons {
fmt.Println(i, p)
// 此修改将不会体现在这个遍历过程中,
// 因为被遍历的数组是persons的一个副本。
persons[1].name = "Jack"
// 此修改不会反映到persons数组中,因为p
// 是persons数组的副本中的一个元素的副本。
p.age = 31
}
fmt.Println("persons:", &persons)
}
输出结果:
0 {Alice 28}
1 {Bob 25}
persons: &[{Alice 28} {Jack 25}]

First thanks for all effort you made for this book. And I find out uncountable new knowledge from here.
But I am pretty sure the author's language teacher must come from Mars. I do understand making all professional content to be clear is not an easy thing, but bro, every time I plucked up my courage to continue reading, I feel uncomparable extremely dull, turgid, boring and so hard to understand, and the more miserable thing is I have to read most of the sentence again and again until I frothed at my mouth and fell convulsed. Of course, the same story will be started again the next day.

首先感谢你为这本书所做的一切努力。从这里我发现了数不清的新知识。
但我很肯定作者的语言老师一定来自火星。我明白把所有的专业内容弄清楚不是一件容易的事,但还是男人,每次我鼓起勇气继续读下去,我都觉得无比乏味,浮肿,坦率地说无聊,难以理解,更可悲的是,我不得不一遍又一遍地读这句话的大部分内容,直到我口吐白沫,抽搐起来。当然,同样的故事会在第二天重新开始。

在Go的内存顺序保证一节中,讲了一个通道关闭的例子,如下
下面是一个通道关闭的例子。在这个例子中,赋值语句k = 1的执行保证在赋值语句y = 1执行之前结束,但不能保证在赋值语句x = 1执行之前结束。

func f6() {
    var k, x, y int
    c := make(chan bool, 1)
    go func() {
        c <- true
        k = 1
        close(c)
    }()
    go func() {
        <-c
        x = 1
        <-c
        y = 1
    }()
}

我自己写了一遍跑了下 但是还是不能理解为什么 赋值语句k = 1的执行保证在赋值语句y = 1执行之前结束,
感觉

        k = 1
        close(c)

        x = 1
        <-c
        y = 1

这两部分的执行顺序完全不能确定啊 请教我谢谢

func main() {
var t T
// t.M(1)是方法调用M(2)的属主实参,因此它
// 将在M(2)调用被推入延迟调用堆栈之前被估值。
defer t.M(1).M(2)
t.M(3).M(4)
}

这里 t.M(1) 先被计算的解释,请问可以说详细一点吗?

我找到的一点资料是
这里第一个表达式计算完了,作为一个 receiver 来调用第二个表达式
ref
但是感觉解释得还是不够

如题,该表述在 自动插入分号的规则是什么呢? 这个部分,白皮书原文中写的 rune, 在这里应该翻译成码字更准确

请问gfw.go101.org上的内容是实时更新的吗?

这里的事实三提到的一个值的地址在程序运行中可能改变。不过这里说的是栈空间变化的情况,那么如果一个对象是分配在堆中的,是否还可能发生变化呢?前阵子对go的内存分配进行了一点浅薄的研究,感觉按这种划分内存的方式,似乎可以不进行内存的整理,那是否代表一个对象分配在堆中的话,那么地址应该不会发生变化?

如果想把数据地址保存在uintptr,通过偏移量来操作数据,需要做些什么考虑呢(比如什么情况下这个地址不会被修改,之前有在boltdb中看到类似下面的做法,是因为boltdb用的是mmap,数据不被gc管理,所以才可以这样?)
image

谢谢大佬!