Golang丰富的I/O 二----cgo版Hello World

《Golang丰富的I/O----用N种Hello World展示》中用多种Hello World的写法展示了golang丰富强大的I/O功能,在此补充一种cgo版的Hello World。以下代码源自go源码:

main.go

package main

import"stdio"

func main() {

    stdio.Stdout.WriteString(stdio.Greeting + "\n")

}

  

file.go

// skip

// Copyright 2009 The Go Authors. All rights reserved.

// Use of this source code is governed by a BSD-style

// license that can be found in the LICENSE file.

/*

A trivial example of wrapping a C library in Go.

For a more complex example and explanation,

see ../gmp/gmp.go.

*/

package stdio

/*

#include <stdio.h>

#include <stdlib.h>

#include <sys/stat.h>

#include <errno.h>

char* greeting = "hello, world";

*/

import"C"

import"unsafe"

typeFile C.FILE

// Test reference to library symbol.

// Stdout and stderr are too special to be a reliable test.

//var = C.environ

func (f *File) WriteString(s string) {

    p := C.CString(s)

    C.fputs(p, (*C.FILE)(f))

    C.free(unsafe.Pointer(p))

    f.Flush()

}

func (f *File) Flush() {

    C.fflush((*C.FILE)(f))

}

var Greeting = C.GoString(C.greeting)

var Gbytes = C.GoBytes(unsafe.Pointer(C.greeting), C.int(len(Greeting)))

  

stdio.go

// skip

// Copyright 2009 The Go Authors. All rights reserved.

// Use of this source code is governed by a BSD-style

// license that can be found in the LICENSE file.

package stdio

/*

#include <stdio.h>

// on mingw, stderr and stdout are defined as &_iob[FILENO]

// on netbsd, they are defined as &__sF[FILENO]

// and cgo doesn't recognize them, so write a function to get them,

// instead of depending on internals of libc implementation.

FILE *getStdout(void) { return stdout; }

FILE *getStderr(void) { return stderr; }

*/

import"C"

var Stdout = (*File)(C.getStdout())

var Stderr = (*File)(C.getStderr())

  

Go程序可以通过cgo工具非常方便地调用c函数。关于go调用C/C++或者C/C++调用go程序可以参考之前的系列随笔《C/C++调用golang》和《calling c++ from golang with swig---windows dll

Golang丰富的I/O 二----cgo版Hello World的更多相关文章

  1. 基于gin的golang web开发:路由二

    在基于gin的golang web开发:路由中我们介绍了Gin的路由和一些获取链接中参数的方法,本文继续介绍其他获取参数的方法. 文件上传 在web开发中文件上传是一个很常见的需求,下面我们来看一下基 ...

  2. Golang垃圾回收机制(二)

    原文:https://blog.csdn.net/qq_15427331/article/details/54613635 Go语言正在构建的垃圾收集器(GC),似乎并不像宣传中那样的,技术上迎来了巨 ...

  3. 《Java从入门到放弃》JavaSE入门篇:面向对象语法二(入门版)

    想了半天,发现单独的封装和多态没什么好讲的,我们就简单说说Java里面对应的语法吧. 相关内容如下: 一.访问修饰符 二.getter/setter方法 三.构造方法 四.super和this 五.s ...

  4. gcc学习(二)[第二版]

    头文件与库文件 1.概要 在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统及库函数调用的声明. 库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的.它 ...

  5. Golang字符串函数认识(二)

    package main import ( "fmt" "strings" ) func main(){ //返回字符在指定字符串中最后一次出现的位置 last ...

  6. Golang 入门系列(十二)ORM框架gorm

    之前在已经介绍了用的github.com/go-sql-driver/mysql 访问数据库,不太了解的可以看看之前的文章 https://www.cnblogs.com/zhangweizhong/ ...

  7. [终极巨坑]golang+vue开发日记【二】,登陆界面制作(一)

    写在前面 本期内容是适合第一次使用vue或者golang开发的,内容会以实战的形式来讲解.看懂本段内容需要了解基础内容有html,css,最好可以看一下vue的基础.并且这里的每个知识点不可能详细解说 ...

  8. 实验二 简易版C语言文法

    <程序>::=begin<语句串>end <语句串>::=<语句>{;<语句>} <语句>::=<赋值语句> < ...

  9. Unity手游之路<二>Java版服务端使用protostuff简化protobuf开发

    http://blog.csdn.net/janeky/article/details/17151465 开发一款网络游戏,首先要考虑的是客户端服务端之间用何种编码格式进行通信.之前我们介绍了Unit ...

随机推荐

  1. js笔记(制作一个简单的计数器)

    首先编写静态页中的按钮: <input  id="result" type="button" value="该程序已经运行了0秒!"/ ...

  2. 【前端开发】--js弹框

    js三种弹框 一.普通弹框 这类弹框就是仅仅是个提示作用,并不会做其它操作 关键词:alert()    这个没啥好说的,就是一个弹框.  二.判断弹框     这类框有一个判断作用 关键字:conf ...

  3. P1092 虫食算

    题目传送:https://www.luogu.org/problem/show?pid=1092 #include <iostream> #include <cstring> ...

  4. mysql 有哪些索引

    Mysql支持哪几种索引 从数据结构角度 1.B+树索引(O(log(n))):关于B+树索引,可以参考 MySQL索引背后的数据结构及算法原理 2.hash索引:a 仅仅能满足"=&quo ...

  5. 白话图解HTTPS原理

        [前言]最近看过几篇文章,内容是关于"全民HTTPS"的.为什么HTTPS,突然会受到如此多业内人士的青睐呢?HTTPS究竟是什么呢?它与HTTP又有怎样的区别呢? 带着这 ...

  6. web前端素材整理汇总

    最近一直搞前端开发,整理下前端用的一些常用素材,分享给大家 框架类 Vue:https://cn.vuejs.org/ iview:https://www.iviewui.com/ 插件类 Jquer ...

  7. 【tyvj P4868】天天和不可描述

    http://www.tyvj.cn/p/4868 超级水的题,用递归来模拟,用链表保存这层的内容,每遇到一个左括号就递归一层并合并返回的链表,遇到右括号后返回. 递归进入下一层时传递个参数标记读取新 ...

  8. python3.6 +tkinter GUI编程 实现界面化的文本处理工具

    更新: 2017.07.17 补充滚动条.win批处理拉起py 2017.08.13 新增自定义图标 --------原创      blogs:    http://www.cnblogs.com/ ...

  9. SALM入门笔记(1):特征点的匹配

    SLAM 主要分为两个部分:前端和后端,前端也就是视觉里程计(VO),它根据相邻图像的信息粗略的估计出相机的运动,给后端提供较好的初始值.VO的实现方法可以根据是否需要提取特征分为两类:基于特征点的方 ...

  10. 使用css修改radio、checkbox样式

    input[type=radio],input[type=checkbox]  { display: inline-block; vertical-align: middle; width: 20px ...