Go 语言 与 C 语言 的比较学习
2015-04-11 14:06
113 查看
对于MarkDown 编译器没有自动保存功能这件事情, 我表示严重的厌恶。 一个来小时的整理化为乌有,而且居然还不能导入到HTML编辑器, 真是无法忍受!
其余的运算符基本相同
取指针
在指针比较中, Go 中的 nil 等效C语言的 NULL .
比如:
C 语言的函数和变量是两个不同的概念, 变量仅可以通过函数指针的形式来标识一个函数.
Go 语言的函数也是一种变量 .
尝试下一下代码:
if for 的代码段必须被大括号包围
if 的 condition 不要括号
for 的 指示部分不要括号
左花括号不能自成一行
在关键字 func 和函数名字之间说明属于那个结构体。
Interface
定义接口,说明函数类型
使用的时候将实现了对应的接口的结构体对象指针赋值给接口对象
Combination
没啥子好说的
Inherit ( by anonymous combination )
这样
关键字
分类 | C | Go |
---|---|---|
字符 | char | 无 |
字符串 | 无 | string |
浮点数 | double , float | float32 , float64 , complex64 , complex128 |
整数 | int long short | uint8 , uint16 , uint32 , uint64 , int8 , int16 , int32 , int64 , uint , int , uintptr , byte = uint8 , rune=unit32 |
bool | 无 | boolean true , false |
函数 | 无 | func |
接口 | 无 | interface |
空 | void | 无 |
Any | 无 | interface{} |
聚合 | enum , struct , union | struct |
符号限定符号 | signed , unsigned , auto , const , extern , register , static , volatile | auto , const |
流程控制 | break , case , do , for , goto , if , else , continue , default , return , switch , while | for , if , else , goto , break , switch , case , default , fallthrough , range , select , range |
数据结构 | 无 | map |
其他 | sizeof , typedef | iota , var , type , defer , go chan , package , import |
操作符
功能 | C | Go |
---|---|---|
取反 | ~ | ^ |
选择 | ? : | |
取指针内容 | -> | |
写入读出 | <- -> | |
初始化并赋值 | := |
变量
X | C | Go |
---|---|---|
声明/定义 | TYPE NAME int i | (var) NAME TYPE var i int |
字符(串) | char , char [] | byte byte[], string |
整形位宽 | 依赖于特定的平台和编译器 | 可以指定宽度, 也可以依赖平台编译器 |
有效范围 | 栈上开辟的变量在作用域内有效, 堆上开辟的变量手动释放之前有效 | 最后一个引用离开作用域之前都有效 |
作用域控制 | static 限制于本文件有效 , extern 寻找其他文件的全局变量 | 大写开头可以导出, 小写仅限本包使用 |
指针
假设a是一个指向某结构体的指针,这个结构体中有个成员叫
b。
C | Go |
---|---|
a->b | a.b |
&运算符 和解指针
*运算符是一样的.
在指针比较中, Go 中的 nil 等效C语言的 NULL .
函数
返回值
C | Go |
---|---|
只能有一个 | 可以有多个 |
func exchange( a int , b int ) ( int , int ){ return b , a }
闭包
C | Go |
---|---|
无 | 有 |
Go 语言的函数也是一种变量 .
尝试下一下代码:
package main import "fmt" func GetFunc( ) func(int) int { i := 0 // 这个变量被绑定到下面的返回函数 return increment_i ( j int ) int { i += j; return i } } func main() { func_i1 := GetFunc() func_i2 := GetFunc() // 上面两次调用GetFunc, 获得两个increment_i 函数, 各自绑定自己的 i 变量 for i :=0 ; i < 10; i++ { fmt.Println("Func1 print : ", func_i1(i)) fmt.Println("Func2 print : ", func_i2(i+1)) } }
PO
X | C | Go |
---|---|---|
if | “if ( condition) XXX else XXX“` | “`if condition {XXX} else {XXX} |
switch | 只能选择可以转化为整形的 , case中没有break自动继续 | 可以任意类型, 不会自动继续, 除非使用failthrough |
select | 是个函数 | 关键字, 选择chan |
for | for ( ; ; ) XXX | for ; ; {XXX} |
while | 有 | 无 |
do … while | 有 | 无 |
编程规范
句末不需要分号if for 的代码段必须被大括号包围
if 的 condition 不要括号
for 的 指示部分不要括号
左花括号不能自成一行
OO
Method在关键字 func 和函数名字之间说明属于那个结构体。
type OOTest struct { a int } func ( this * OOTest) GetAByPointer() int { return this.a } func ( this OOTest) GetAByCopy() int { return this.a }
Interface
定义接口,说明函数类型
type IOOTest interface { GetAByPointer() int }
使用的时候将实现了对应的接口的结构体对象指针赋值给接口对象
var i_test IOOTest var test OOTest i_test = &test
Combination
没啥子好说的
Inherit ( by anonymous combination )
type OOTest1 struct{ OOTest b int }
这样
OOTest1就拥有了
OOTest的成员变量和方法
并发
X | C/C++ | Go |
---|---|---|
实现 | 依赖系统接口的线程 | go 关键字, goroutine协程 |
锁 | 依赖系统提供或者库或者自己实现 | sync包 |
通讯 | 共享内存/消息 | 消息 chan机制 |
项目管理
X | C/C++ | Go |
---|---|---|
编译器 | 自行挑选 | 自带 |
工程管理 | 自行挑选 | 自带 |
测试机制 | 自行挑选 | 自带 |
统一编码格式 | 依赖程序员自觉 | 工具统一整理 |
相关文章推荐
- Go语言学习笔记----与C语言的比较学习
- go语言学习笔记之并发编程
- GO语言学习备注
- go语言学习:web服务器 golang版
- 学习go语言 习题自己的答案 chapter2
- go 语言学习记录1
- 想学习编程却又不知从何入手?那么先看所有语言的比较
- go语言学习记录4
- go语言基础学习二
- go语言学习资源
- go语言学习记录2
- Go语言学习札记—— 第二章 Go编程环境(2)
- go语言学习-在ubuntu上安装golang
- Go语言学习笔记4——struct
- go语言学习:搭建go环境
- Go语言学习笔记2——数组和Slice
- Go语言学习札记——第三章 Go基本的程序设计结构(1)
- go语言学习-golang的基本数据类型
- go语言学习笔记之slice用法
- go语言学习记录3