Порядок выполнения функций языка c в 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 build с параметром Run after build) -
вывод)
оператор Go
другой оператор Go
вызов кода C!

- в терминале
$ go run hello.go
Оператор Go
Вызов кода C!
Другой оператор Go


person unilep    schedule 14.01.2019    source источник
comment
Я создал эту проблему в системе отслеживания проблем GoLand youtrack.jetbrains.com/issue/GO-6711   -  person dlsniper    schedule 14.01.2019
comment
Разве это не то, что я делаю неправильно? Вероятно, это проблема с GoLand? Спасибо.   -  person unilep    schedule 14.01.2019
comment
Вероятно, с GoLand проблем нет, он просто сбрасывает стандартный вывод в другое время. когда вы добавляете `fflush (stdout); `после вашего вызова printf он должен работать так, как вы думаете.   -  person Nordiii    schedule 14.01.2019
comment
Ты прав. При применении fflush он работает должным образом. Спасибо.   -  person unilep    schedule 14.01.2019


Ответы (1)


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

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

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

person Eli Bendersky    schedule 14.01.2019
comment
Эли, не могли бы вы объяснить, почему он отлично работает в оболочке? Я s / ltracing bash выполнял эту программу, но не могу найти никаких вызовов, отключающих буферизацию. - person neverov; 26.01.2019
comment
@neverov: между ними нет определенного порядка, это зависит от многих факторов того, как обрабатываются потоки - person Eli Bendersky; 27.01.2019