Golang中的C语言函数执行顺序

时间:2019-01-14 10:13:09

标签: go goland

我正在学习golang,但是有一部分我不懂使用c语言。

主要,第二次执行c语言函数,并且输出因IDE而异。 为什么会打印出来?

package main

//#include<stdio.h>
//void callC() {
// printf("Calling C code!\n");
//}
import "C"
import "fmt"


func main() {
    fmt.Println("A Go statement")
    C.callC()
    fmt.Println("Another Go statement")
}

-在GoLand中(模板:使用“在构建后运行”选项进行构建)-
输出)
Go语句
另一个Go语句
调用C代码!

-在终端机中
$运行hello.go
Go语句
调用C代码!
另一个Go语句

1 个答案:

答案 0 :(得分:3)

C的printf在libc中使用较低级别的系统调用实现。 libc具有用于I / O的缓冲区以提高性能,并决定何时刷新这些缓冲区(特别是printf发出的stdout流将被缓冲)。

Go使用较低级别的系统调用拥有自己的printf,为此根本不使用C的printf或libc。因此,其刷新决策与C的printf是分开的。

所以这里真的没有问题。 printf不保证无缓冲的输出(如果需要,可以使用错误流显式地进行刷新),因此在C和Go版本之间没有保证的顺序。