Go语言学习笔记----与C语言的比较学习
最近学习了golang(go语言),其中大部分是和C相似的,记录一下不同的地方,需要注意 1.go的左花括号“{”不能单独放在一行 package main
import "fmt"
func main()
{ //error,can't have the opening brace on a separate line
fmt.Println("hello there!")
}
错误信息: 分析: 改正代码: package main
import "fmt"
func main() {
fmt.Println("works!")
}
2.分支语句if…else…的判断条件不加括号,并且else不能另起一行 错误代码 for true {
fmt.Scanln(&cmd)
if (strings.Compare(cmd,"help") == 0) {
fmt.Println("help")
}
else if (strings.Compare(cmd,"add") == 0) {
fmt.Println("add")
}
else {
fmt.Println("Wrong cmd!")
}
c语言的if判断条件是要加括号()的,而go语言不需要. for true {
fmt.Scanln(&cmd)
if strings.Compare(cmd,"help") == 0 {
fmt.Println("help")
} else if strings.Compare(cmd,"add") == 0 { //注意else不能另起一行
fmt.Println("add")
} else { //注意else不能另起一行
fmt.Println("Wrong cmd!")
}
3.每句末尾不加分号; 参考: 4.C中的NULL,在go中为nil 5.同一个包下文件太长时,可以分为多个文件,只要在第一行声明为同一个包即可 6.判断字符串string是否为空 if len(str) == 0{
}
与 if str == "" {
}
两个效率是一样的 7.函数指针 typedef struct DataNode //先定义结构体
{
char* cmd;
char* desc;
int (*handler)();//函数指针
struct DataNode *next;
}tDataNode;
调用方法: tDataNode *p //假设p指向一个非空tDataNode
p->handler(); //用这个tDataNode中的函数指针调用响应函数
go语言: type DataNode struct { //先定义结构体
cmd string
desc string
handler func() //函数指针,指向一个没有返回值的函数
handler func() int //函数指针,指向一个返回值int的函数
next *DataNode
}
调用方法: var p *DataNode
p.handler()
注意go中指针的使用方式,在下一点中详述 具体使用见: 8.指针调用方式: type DataNode struct {
cmd string
desc string
handler func()
next *DataNode
}
var p *DataNode //假设p指针指向一个非空的DataNode结构体
p.cmd //访问cmd域(是个字符串)
p.desc //访问desc域(是个字符串)
p.handler() //调用handler域(是个函数指针)
p.next //访问next域(是个DataNode指针)
9.函数调用顺序 .menu_v2.5.go:37: syntax error: unexpected findCmd,expecting (
main函数中调用findCmd函数,则findCmd函数的定义必须放在main之前.这与c语言类似 10.类型强制转换 c语言用”(类型)”的语法进行强制转换,如 main()
{
float f=5.75;
printf("(int)f=%d,f=%f/n",(int)f,f);
}
将float f强制转换成int f float f=5.75;printf(“(int)f=%d,f=%f/n”,(int)f,f); 本例表明,f虽强制转为int型,但只在运算中起作用, 是临时的,而f本身的类型并不改变。因此,(int)f的值为 5(删去了小数)而f的值仍为5.75。 而go语言不支持这种语法,必须用unsafe包: package main
import (
"fmt"
"unsafe"
)
func main() {
var n int64 = 5
var pn = &n
var pf = (*float64)(unsafe.Pointer(pn))
// now,pn and pf are pointing at the same memory address
fmt.Println(*pf) // 2.5e-323
*pf = 3.14159
fmt.Println(n) // 4614256650576692846
}
注意这一句: var pf = (*float64)(unsafe.Pointer(pn))
是两个操作:先将指向int64类型的指针pn用unsafe.Pointer()转换成unsafe.Pointer指针(无类型,相当于c的void指针,下一节说明),再将无类型指针强制转换成float64类型指针 unsafe包用法: 11.无类型指针unsafe.Pointer void *args //C语言声明void型指针args
args unsafe.Pointer //go语言声明unsafe.Pointer型指针args
//这是个特殊指针类型,不用加*
args *int //go语言声明int型指针,注意与上面的区别
12.go的callback与c语言callback的声明方法不同 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |