c语言中go语句的作用,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!")

}

错误信息:

/tmp/sandBox826898458/main.go:6: Syntax error:

unexpected semicolon or newline before {

分析:

两个花括号各占一行,上下对齐,是C语言的一种编码风格.而另一种风格是左花括号不独占一行,而右花括号独占一行,这也是Go语言遵循的唯一风格

改正代码:

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语言不需要.

另外注意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 编译器自动完成。

如果你打算将多个语句写在同一行,它们则必须使用 ; 人为区分,但在实际开发中我们并不鼓励这种做法。

4.C中的NULL,在go中为nil

C常用NULL表示空指针,在go中将空指针赋值为nil

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指向一个非空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类型指针

11.无类型指针unsafe.Pointer

go语言的unsafe.Pointer类型指针(对应C语言的void指针,go里面没有void指针)

举例:

void *args //C语言声明void型指针args

args unsafe.Pointer //go语言声明unsafe.Pointer型指针args

//这是个特殊指针类型,不用加*

args *int //go语言声明int型指针,注意与上面的区别

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值