Golang语言 与 C 语言 的比较学习
对于MarkDown 编译器没有自动保存功能这件事情, 我表示严重的厌恶。 一个来小时的整理化为乌有,而且居然还不能导入到HTML编辑器, 真是无法忍受!
关键字
分类 |
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
。
a.b
- 取指针
&
运算符 和解指针*
运算符是一样的. - 在指针比较中, Go 中的 nil 等效C语言的 NULL .
函数
返回值
C |
Go |
---|---|
只能有一个 |
可以有多个 |
比如:
func exchange( a int , b int ) ( int , int ){ return b , a
}
闭包
C |
Go |
---|---|
无 |
有 |
C 语言的函数和变量是两个不同的概念, 变量仅可以通过函数指针的形式来标识一个函数. Go 语言的函数也是一种变量 . 尝试下一下代码:
package mainimport "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 IOOTestvar 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 |
---|---|---|
编译器 |
自行挑选 |
自带 |
工程管理 |
自行挑选 |
自带 |
测试机制 |
自行挑选 |
自带 |
统一编码格式 |
依赖程序员自觉 |
工具统一整理 |
原文地址
http://studygolang.com/wr?u=http%3a%2f%2fblog.csdn.net%2fcchd0001%2farticle%2fdetails%2f44982127
- LINQ to SQL(4):OR设计器
- 在不同浏览器都实用的各窗口大小获取方法
- JavaScript获得对象属性个数的方法
- 设计模式专题(十一)——抽象工厂模式
- Canvas 图形组合方式
- HTML5 FileReader接口学习笔记
- 如何用BBED使Offline的数据文件Online
- Entity Framework4.3 Code-First基于代码的数据迁移讲解1.建立一个最初的模型和数据库 2.启动Migration(数据迁移)3.第一个数据迁移4.订制的数据迁移4.动态
- 轻松初探Python(六)—函数
- css3实现圆角边框渐变
- 设计模式专题(十二)——状态模式
- HTML5新增属性学习笔记
- HTML5标签学习笔记
- 设计模式专题(十三) ——备忘录模式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【动手学深度学习笔记】之Pytorch实现线性回归
- 【动手学深度学习笔记】之softmax回归
- 一文全面梳理各种锁机制
- 【动手学深度学习笔记】之图像分类数据集(Fashion-MNIST)
- 探讨缓存行与伪共享
- Stream 流解读
- 3 分钟生成一个单元测试报告,这个样式爱了
- 使用pymouse模块时候报错No module named 'windows'
- GO用内置包写爬虫
- rsyslog详解实战和避坑
- 删除行对MySQL序列有这么多影响?
- 论C++如何优雅的使用数组
- Dubbo如何通过SPI提高框架的可扩展性?
- 你必须熟练使用的30个有用Python代码片段
- git上过滤一些编辑器生成的文件