V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  tyzual  ›  全部回复第 1 页 / 共 1 页
回复总数  5
2017-04-11 16:38:01 +08:00
回复了 drlalll 创建的主题 C C 语言 数组 指针 函数 问题
这段代码槽点略多。不知道怎么吐槽了。。。
2017-04-11 16:22:40 +08:00
回复了 soratadori 创建的主题 C++ 这段 c++代码啥意思?
*(unsigned int*)sample = *((unsigned int*)Buffer+i);

楼主主要是看不懂这句话吧。
按照楼主的说明 Buffer 应该是一个类似于
byte *Buffer 或者 byte Buffer[随便一个什么数字] 的东西。
等号右边先把 Buffer(强行)转成一个 unsigned int *这样的话,后面 + i 就会按照无符号整型来计算偏移量,也就是+i 会向后移动 i * sizeof(unsigned int) 个地址。(否则会向后移动 i * sizeof(byte))。
计算完成偏移量以后,再对这个地址解引用(取值),因为这个时候,地址的类型是 unsigned int *所以此时编译器会把当前地址储存的数据当成一个无符号整形来对待, unsigned int 站四个 byte ,所以编译器会从计算完成的偏移量开始向后读取四个 byte 的内容作为要赋的值。即等号右边的值。

等号左边先把 sample 强行转成了一个 unsigned int *然后在解引用(取值)。因此,解引用完成的时候,等号左边的类型是一个 unsigned int (虽然实际上不是)。因此编译器会把等号右边的值写入到 sample 起始地址到 sample 地址后四个 byte 中。
而 sample 的实际类型是 byte[4],长度正好也是四个 byte 。所以 sample[0] 的值正好就是赋值号右边那个值的最低位 byte 的值, sample[1]是第二低位 byte 的值。以此类推。
2016-12-30 20:17:21 +08:00
回复了 kopp123 创建的主题 Go 编程语言 一段 golang 代码不太懂就 golang 大牛解读
当 go routine 启动第一次执行时 range 已经跑了很多圈而起 go func 对 range 中的循环变量是引用捕获。
这句话可以这样理解


如果 f:=file go func 中对 f 就是值捕获。
go 中只有按引用捕获,所以如果在 go func 中引用 f 还是按引用捕获,只不过捕获的是 f 的引用。 go func 中的值会随着 f 变化而变化。
如果在 go func 中不想让捕获的值随着外部修改而变化的话应该把捕获的值当成一个参数传递。代码大概长这样
====================
func makethumbnail2(filename []string) {
ch := make(chan struct{})
for _, file := range filename {
go func(file string) {
fmt.Println(file)
//thumbnail.ImageFile(file)
ch <- struct{}{}
}(file)
}
for range filename {
<-ch
}
}
=================================
注意 go func 多了一个 file string 的参数,而 go func 结束的时候手动把 file 传递进去了。
因为 go func 有一个 file 参数,所以 go func 里面的 fmt.Println(file)的 file 实际上打印的是 go func 的参数。
而 go func 结束的时候在括号中传递的参数 file 是 for range 中当前的 file 。而 string 类型的参数是按照值的类型传递的。所以上面代码就会(无序)输出 file0 - file99
2016-12-30 19:22:14 +08:00
回复了 kopp123 创建的主题 Go 编程语言 一段 golang 代码不太懂就 golang 大牛解读
1. 贴代码的时候注意格式。你贴成这样鬼知道代码长啥样
2. 贴代码的时候把无关代码注释掉。比如 thumbnail.ImageFile(file)
3. 你上面贴的那一段代码格式化好以后大概长这样
===========================================
package main

import (
"fmt"
)

func makethumbnail2(filename []string) {
ch := make(chan struct{})
for _, file := range filename {
file = file
go func() {
fmt.Println(file)
//thumbnail.ImageFile(file)
ch <- struct{}{}
}()
}
for range filename {
<-ch
}
}

func main() {
var files []string
for i := 0; i < 100; i++ {
files = append(files, fmt.Sprintf("file%d", i))
}
makethumbnail2(files)
}

====================================
4. 下面来解答你的问题

1.1 你在 func() 里面 捕获了 file 变量。而 go 的捕获机制是按照引用捕获。 也就是说,如果我们在 func()外部改变 file 的值, func()内部的 file 也会受到影响
1.2 你的 func()是在另一个 goroutine 里面执行的。也就是说,一方面有 N 多个 func()在不同的 goroutine 里面执行。一方面第一个 for range 循环又在改变 file 的值。在第一个 for range 完成之前,你看到的输出应该是随缘产生的。而 for range 完成之后,则会输出最后一个文件名。
1.3 至于楼主的四个随机文件,那单纯是因为输出了 4 个文件以后,第一个 for range 完成了。
1.4 上面那段测试代码在我的环境下运行只输出了 10 个 file99
1.5 参考资料 https://www.goinggo.net/2014/06/pitfalls-with-closures-in-go.html
2016-10-26 08:44:44 +08:00
回复了 akiossdev 创建的主题 小米 只有我觉得小米 MIX 好看吗
小米这次真心牛逼了.
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   914 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 17ms · UTC 22:10 · PVG 06:10 · LAX 15:10 · JFK 18:10
Developed with CodeLauncher
♥ Do have faith in what you're doing.