我一直在学习频道,教科书的例子看起来简单易懂.但是,我无法理解以下行为.
func main() {
message := make(chan string)
message <- "ping"
fmt.Println(<-message)
}
Run Code Online (Sandbox Code Playgroud)
为什么以上导致错误?我知道我可以通过引入一个例程来让发送者和接收者都准备就绪.但是,如果是这种情况,为什么以下工作呢.
func main() {
message := make(chan string,1)
message <- "ping"
fmt.Println(<-message)
}
Run Code Online (Sandbox Code Playgroud)
*********感谢Joe McMahon的回答*********
*********下面记录我的参考*********
我假设了一个缓冲区1(与2不同)也会阻塞主程序,直到找到相应的接收器.看起来像1的缓冲区就像0和1一样工作,并且不会阻塞第0次写入/读取的代码.要使用缓冲区演示块,
func main() {
message := make(chan string, 1)
message <- "ping1"
message <- "ping2"
fmt.Println(<-message) //Unreachable code.
}
Run Code Online (Sandbox Code Playgroud) 为什么不在以下代码中修改切片:
package pointers
import "fmt"
func modifyObject(v *Vertex) {
v.x = v.x * v.x
v.y = v.y * v.y
}
func modifyArray(vertices *[]Vertex) {
for _, v := range *vertices {
v.x = v.x * v.x
v.y = v.y * v.y
}
}
func DemoPointersArray() {
v := Vertex{2, 3}
modifyObject(&v)
fmt.Println("Vertex modified successfully:", v)
v1 := Vertex{2, 3}
v2 := Vertex{20, 30}
vertices := []Vertex{v1, v2}
modifyArray(&vertices)
fmt.Println("Vertices are NOT modified:", vertices)
}
Run Code Online (Sandbox Code Playgroud)
输出:
顶点修改成功:{4 9}
顶点未修改:[{2 3} {20 …
如何让 demo() 依次执行。
demo()
async function demo() {
doAll()
console.log("I DO NOT print sequentially");
}
async function doAll() {
var number = await getNumber();
var double = await doubleWithTimeout(number);
console.log(number,double)
}
async function getNumber() {
return new Promise(function(resolve, reject) {
var a = 2;
resolve(a);
});
}
async function doubleWithTimeout(x) {
return new Promise(function(resolve, reject) {
setTimeout(() => {
resolve(x * 2);
}, 2 );
});
}Run Code Online (Sandbox Code Playgroud)
结果:
我不按顺序打印
2 4
预期结果:
2 4
我按顺序打印
我希望我可以摆脱下面的代码,但你不能在承诺中等待:
async function demo() { …Run Code Online (Sandbox Code Playgroud)