порядок выполнения функции языка c в Голанге - PullRequest
0 голосов
/ 14 января 2019

Я изучаю Голанг, но есть часть, которую я не понимаю, используя язык 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 (Шаблон: сборка с опцией Выполнить после сборки) -
выход)
Заявление A Go
Другое заявление Go
Звонок код C!

- в терминале
$ go run hello.go
Заявление A Go
Звонок код С!
Другое заявление Go

1 Ответ

0 голосов
/ 14 января 2019

C printf реализован в libc с использованием системных вызовов более низкого уровня. libc имеет буферы для ввода / вывода для повышения производительности, и она решает, когда очищать эти буферы (в частности, поток stdout, в который printf испускается, буферизуется).

Go имеет свой собственный printf, использующий системные вызовы более низкого уровня, для этого он вообще не использует C printf или libc. Поэтому его решения по очистке отделены от C printf.

Так что, на самом деле, здесь нет проблем. printf не гарантирует небуферизованный вывод (вы можете использовать поток ошибок для этого, при необходимости, явно сбрасывать), поэтому нет гарантированного упорядочения между версиями C и Go.

...