doupo2633 2019-01-14 10:13
浏览 46
已采纳

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

I am studying golang, but there is a part that I do not understand using c language.

In main, the c language function is executed for the second time, and the output is different depending on the IDE. Why does this print out?

package main

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


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

-- in GoLand (Template: go build with Run after build option) --
output)
A Go statement
Another Go statement
Calling C code!

-- in terminal
$ go run hello.go
A Go statement
Calling C code!
Another Go statement

  • 写回答

1条回答 默认 最新

  • douzhang5199 2019-01-14 14:44
    关注

    C's printf is implemented in libc, using lower level system calls. libc has buffers for I/O to improve performance, and it decides when to flush these buffers (specifically the stdout stream which printf emits to is buffered).

    Go has its own printf using lower level system calls, it doesn't uses C's printf or libc at all for this. Therefore its flushing decisions are separate from C's printf.

    So there's not problem here, really. printf doesn't guarantee unbuffered output (you can use the error stream for that, if necessary, of flush explicitly), so there is no guaranteed ordering between the C and Go versions.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题