go语言cat函数 go语言iota

golang 内置函数new 和struct 初始化的区别在go语言中 new()这是一个用来分配内存的内置函数,它的第一个参数是一个类型 , 不是一个值,它的返回值是一个指向新分配的 t 类型的零值的指针 。
在golang的代码定义如下: func new(t Type) *Typestrut{}直接使用struct{} 来初始化strut时,返回的是一个struct类型的值 , 而不是指针两者是不一样的 两者对比代码如下:
type Student struct{id intname string }func main(){var s_1 *Student = new(Student)s_1.id = 100s_1.name = "cat"
var s_2 Student = Student{id:1,name:"tom"}fmt.Println(s_1,s_2) }输出结果:
{100 cat} {1 tom} 从上面代码的声明和打印的结果中就可以看出 s_1 的类型为指针,s_2 为一个Student类型
go语言如何调用c函数直接嵌入c源代码到go代码里面
package main
/*
#include stdio.h
void myhello(int i) {
printf("Hello C: %d\n", i);
}
*/
import "C"
import "fmt"
func main() {
C.myhello(C.int(12))
fmt.Println("Hello Go");
}
需要注意的是C代码必须放在注释里面
import "C"语句和前面的C代码之间不能有空行
运行结果
$ go build main.go./main
Hello C: 12
Hello Go
分开c代码到单独文件
嵌在一起代码结构不是很好看,很多人包括我 , 还是喜欢把两个分开,放在不同的文件里面,显得干净,go源文件里面是go的源代码,c源文件里面是c的源代码 。
$ ls
hello.chello.hmain.go
$ cat hello.h
void hello(int);
$ cat hello.c
#include stdio.h
void hello(int i) {
printf("Hello C: %d\n", i);
}
$ cat main.go
package main
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go");
}
编译运行
$ go build./main
Hello C: 12
Hello Go
编译成库文件
如果c文件比较多,最好还是能够编译成一个独立的库文件,然后go来调用库 。
$ find mylib main
mylib
mylib/hello.h
mylib/hello.c
main
main/main.go
编译库文件
$ cd mylib
# gcc -fPIC -shared -o libhello.so hello.c
编译go程序
$ cd main
$ cat main.go
package main
// #cgo CFLAGS: -I../mylib
// #cgo LDFLAGS: -L../mylib -lhello
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go");
}
$ go build main.go
运行
$ export LD_LIBRARY_PATH=../mylib
$ ./main
Hello C: 12
Hello Go
在我们的例子中 , 库文件是编译成动态库的,main程序链接的时候也是采用的动态库
$ ldd main
linux-vdso.so.1 =(0x00007fffc7968000)
libhello.so = ../mylib/libhello.so (0x00007f513684c000)
libpthread.so.0 = /lib64/libpthread.so.0 (0x00007f5136614000)
libc.so.6 = /lib64/libc.so.6 (0x00007f5136253000)
/lib64/ld-linux-x86-64.so.2 (0x000055d819227000)
理论上讲也是可以编译成整个一静态链接的可执行程序,由于我的机器上缺少静态链接的系统库,比如libc.a,所以只能编译成动态链接 。
go语言从入门到精通第四天函数当我们将一种功能用于多个地方的时候 , 就需要封装这些功能,以便于多次使用,然而封装就需要使用函数来进行封装 , 因此本章我们就来说说函数的使用方法 。我们先来看看涉及到函数的一些用法目录 。如下:
无参函数
有参函数
带返回值的函数
带多个返回值的函数
匿名函数
闭包
自调用
递归
本章内容还是比较丰富的,请耐心往下看 。

推荐阅读