Go语言学习笔记----与C语言的比较学习
来源:互联网 发布:2007版excel数据有效性 编辑:程序博客网 时间:2024/05/21 17:51
最近学习了golang(go语言),其中大部分是和C相似的,记录一下不同的地方,需要注意
1.go的左花括号“{”不能单独放在一行
出错代码:
package mainimport "fmt"func main() { //error, can't have the opening brace on a separate line fmt.Println("hello there!")}
错误信息:
/tmp/sandbox826898458/main.go:6: syntax error:
unexpected semicolon or newline before {
分析:
两个花括号各占一行,上下对齐,是C语言的一种编码风格.而另一种风格是左花括号不独占一行,而右花括号独占一行,这也是Go语言遵循的唯一风格
改正代码:
package mainimport "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语言不需要.
另外注意else语句必须紧跟着上一个if的结束花括号,不能另起一行.
改正代码:
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.每句末尾不加分号;
在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。
如果你打算将多个语句写在同一行,它们则必须使用 ; 人为区分,但在实际开发中我们并不鼓励这种做法。
参考:
http://www.golangtc.com/t/5568e8e0b09ecc4485000003
http://www.runoob.com/go/go-basic-syntax.html
4.C中的NULL,在go中为nil
C常用NULL表示空指针,在go中将空指针赋值为nil
5.同一个包下文件太长时,可以分为多个文件,只要在第一行声明为同一个包即可
转载:
http://blog.csdn.net/a_flying_bird/article/details/52891876
6.判断字符串string是否为空
if len(str) == 0{}
与
if str == "" {}
两个效率是一样的
7.函数指针
C中函数指针:
typedef struct DataNode //先定义结构体{ char* cmd; char* desc; int (*handler)();//函数指针 struct DataNode *next;}tDataNode;
调用方法:
tDataNode *p //假设p指向一个非空tDataNodep->handler(); //用这个tDataNode中的函数指针调用响应函数
go语言:
type DataNode struct { //先定义结构体 cmd string desc string handler func() //函数指针,指向一个没有返回值的函数 handler func() int //函数指针,指向一个返回值int的函数 next *DataNode}
调用方法:
var p *DataNodep.handler()
注意go中指针的使用方式,在下一点中详述
具体使用见:
http://blog.csdn.net/u012033124/article/details/72272140
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 mainimport ( "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包用法:
Go 里面的 unsafe 包详解
11.无类型指针unsafe.Pointer
go语言的unsafe.Pointer类型指针(对应C语言的void指针,go里面没有void指针)
举例:
void *args //C语言声明void型指针argsargs unsafe.Pointer //go语言声明unsafe.Pointer型指针args //这是个特殊指针类型,不用加*args *int //go语言声明int型指针,注意与上面的区别
12.go的callback与c语言callback的声明方法不同
见本人文章
http://blog.csdn.net/u012033124/article/details/72794358
- Go语言学习笔记----与C语言的比较学习
- Go 语言 与 C 语言 的比较学习
- Go语言学习笔记
- Go语言学习笔记
- go语言学习笔记
- Go语言学习笔记
- GO语言学习笔记
- Go语言学习笔记
- GO语言学习笔记
- Go语言学习笔记
- Go语言学习笔记
- Go语言学习笔记
- go语言学习笔记
- Go语言学习笔记(一) [Go语言的HelloWorld]
- Go语言的学习
- Go语言学习笔记 --- 数组的使用
- C语言学习笔记--C语言的环境与编译
- go语言学习笔记11
- 萌萌哒的MYSQL
- 技术转型产品学习工具收集与整理——第十一天
- Android有关图形图像的学习总结
- 初窥splay
- Properties类
- Go语言学习笔记----与C语言的比较学习
- springmvc 接受参数
- C++内存管理
- 大数——大数加法
- owl-carousel2轮播图插件
- 计算机视觉入门笔记
- 初识.net界面程序(6)——类及其属性和方法的实现练习
- 树形dp
- hasmap源码分析(jdk1.8)