首页 > 其他分享 >CGO输出helloworld

CGO输出helloworld

时间:2023-07-19 22:46:45浏览次数:35  
标签:输出 ---- const CGO void helloworld char go hello

使用CGO输出helloworld

本人windows版本

go version go1.18.3 windows/amd64
 dir   目录: D:\cgo\main


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2023/7/19     21:59                .idea
-a----         2023/7/19     22:18           1960 first.go
-a----         2023/7/19     22:03             72 hello.c
-a----         2023/7/19     22:03            101 hello.cpp
-a----         2023/7/19     22:07            204 hello.go
-a----         2023/7/19     22:10            284 hello.h
-a----         2023/7/19     22:11        6008785 main.exe

first.go

package main
//简单的说,把下面注释的内容写在注释里面显然是比较麻烦的。所有简便起见,把注释的内容写在hello.h里面,然后只引入一个hello.h就好了。
/*
#include<hello.h>
//#include<stdio.h>
//有没有static并不影响,也不需要大小写
//static void sayHello(const char* s) {
//	puts(s);
//}
//write by c
//void sayHelloByC(const char* s);
//write by c++
//void sayHelloByCpp(const char* s);
//void sayHelloByGo(char* s);
*/
import "C"
import "fmt"

func main() {
	//println("hello world")
	C.puts(C.CString("print hello by c.puts\n"))
	C.sayHello(C.CString("this is hello\n"))                   //直接写一个static函数
	C.sayHelloByC(C.CString("this is hello from c file\n"))    //在这里定义函数,用C实现
	C.sayHelloByCpp(C.CString("this is hello from c++ file"))  //在这里定义函数,用C++实现
	C.sayHelloUseGo(C.CString("this is hello from go file\n")) //一个头文件,用go语言实现功能
	C.sayHelloByGo(C.CString("this is hello from go file too\n"))
	sayHelloUseGo(C.CString("just call from go\n"))
	sayHelloByGo(C.CString("just call from go too"))
}

hello.h

void sayHelloUseGo(char* s);
#include<stdio.h>
//有没有static并不影响,也不需要大小写
static void sayHello(const char* s) {
	puts(s);
}
//write by c
void sayHelloByC(const char* s);
//write by c++
void sayHelloByCpp(const char* s);

void sayHelloByGo(char* s);

hello.go

package main

import "C"
import "fmt"

//export sayHelloUseGo
func sayHelloUseGo(s *C.char) {
	fmt.Print(C.GoString(s))
}

//export sayHelloByGo
func sayHelloByGo(s *C.char) {
	fmt.Print(C.GoString(s))
}

hello.c

#include <stdio.h>

void sayHelloByC(const char* s) {
    puts(s);
}

hello.cpp

#include<iostream>
extern "C" void sayHelloByCpp(const char* s) {
    std::cout<<s<<std::endl;
}

go run .
或者
go build

执行结果

print hello by c.puts

this is hello

this is hello from c file

this is hello from c++ file
this is hello from go file
this is hello from go file too
just call from go
just call from go too

编程语言之间的相互调用显然是非常方便的,不用再重复开发,这里只是简单举例使用cgo进行输出字符串,至于其他的数据类型,也是大差不差的。

标签:输出,----,const,CGO,void,helloworld,char,go,hello
From: https://www.cnblogs.com/dayq/p/17566963.html

相关文章

  • 关于格式化输入输出
    提醒自己一下...水一篇%g浮点数舍去末尾0%nd以n字符宽度输出整数,宽度不足时用空格补充,n为负数时左对齐,否则右对齐%0nd以n字符宽度输出整数,宽度不足时用0补充%.nlf输出浮点数,精确到小数点后n位......
  • 输出svg图形,显示数据标签 python
    输出SVG图形,显示数据标签的PythonSVG(ScalableVectorGraphics)是一种基于XML的矢量图形标准,它使用XML格式描述二维图形和图形应用程序。在Python中,我们可以使用不同的库来生成SVG图形,并通过添加数据标签的方式向图形添加数据信息。本文将介绍如何使用Python生成SVG图形,并显示数据......
  • 什么是java中输出流的基类
    什么是Java中输出流的基类概述在Java中,输出流是用来将数据从程序输出到各种目标的流。它是一种用于写入数据的抽象类,是JavaI/O库的一部分。Java中的输出流类众多,但它们都是从一个基类继承而来的。了解输出流的基类是理解和使用Java输出流的关键。本文将向你介绍Java中输出流的基......
  • 随笔(二十五)『3个线程交替输出1-100、交替输出ABC』
    1、3个线程交替输出1-100/***需求:*3个线程交替输出1-100*/publicclassTestPrint1_100{privateIntegerstate=1;//状态值1-t1执行,2-t2执行,3-t3执行privateIntegercount=1;//循环次数初始值publicvoidprint1_100(TestPrint1_100pri......
  • Spring Boot怎么输出到控制台
    SpringBoot是一个开发框架,它提供了许多方便的功能,包括输出到控制台。在本文中,我将介绍如何在SpringBoot应用程序中输出到控制台,并提供代码示例。在SpringBoot中,可以使用标准的Java输出语句System.out.println()来输出到控制台。但是,SpringBoot还提供了更方便的方法来输出日志......
  • .net 6 winform启动器:调用CMD命令行执行dotnet命令启动.net core程序并将控制台输出日
    背景历史遗留问题,生产车间运行的一个.netcoresignalr程序使用命令行程序启动,经常由于生产人员误操作将光标停留在控制台上导致程序假死,丢失部分测试数据,车间随便找了一台win10系统部署的程序,源代码遗失,电脑也是阉割版,原开发者已经离职多年无人敢动,于是想了一个歪门邪道发方......
  • python字符串转换GBK输出
    Python字符串转换GBK输出在Python中,字符串是一种常见的数据类型。它是由一系列字符组成的,可以包含字母、数字、符号等内容。在处理字符串时,有时候需要进行编码转换,特别是当涉及到中文字符时,常常需要将字符串转换为GBK编码输出。本文将为您介绍如何使用Python将字符串转换为GBK编码......
  • java HelloWorld
    HelloWorld1新建一个文件夹,存放代码2新建一个java文件-java后缀名为.java-Hello.java-[注意点]系统可能没有显示文件后缀名,我们需要手动打开3编写代码publicclassHello{publicstaticvoidmain(String[]args){System.out.println("HelloWorld!"......
  • spark如何控制输出到hdfs上的小文件
    项目方案:Spark控制输出到HDFS上的小文件背景介绍在使用Spark进行数据处理和分析时,输出的结果数据通常存储在Hadoop分布式文件系统(HDFS)上。然而,有时输出的结果会被分割成大量的小文件,这可能对后续的数据读取和处理造成性能问题。因此,我们需要一种方法来控制输出到HDFS......
  • 在物联网应用中需要经常处理数据帧,请你写一段处理数据帧的代码将收到的数据进行解析输
    提示:1、数据帧的长度不定,但是帧头帧尾是固定的2、数据帧的参数数量不定,请注意3、每次收到的数据可能不是完整的一帧,但是不能把不完整的数据帧丢弃,应该等待到下一完整帧接收到后才丢弃4、一次可能接受到不止一个数据帧,可能是多个,需要针对不同数据帧进行分割搜说关键词:数据帧粘......