分享
  1. 首页
  2. 文章

Go 语言 与 C 语言 的比较学习

xuybin · · 4164 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

目录(?) [-]

对于MarkDown 编译器没有自动保存功能这件事情, 我表示严重的厌恶。 一个来小时的整理化为乌有,而且居然还不能导入到HTML编辑器, 真是无法忍受!

关键字


分类CGo
字符 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

操作符


功能CGo
取反 ~ ^
选择 ? :
取指针内容 ->
写入读出 <- ->
初始化并赋值 :=

其余的运算符基本相同

变量


XCGo
声明/定义 TYPE NAME int i (var) NAME TYPE var i int
字符(串) char , char [] byte byte[], string
整形位宽 依赖于特定的平台和编译器 可以指定宽度, 也可以依赖平台编译器
有效范围 栈上开辟的变量在作用域内有效, 堆上开辟的变量手动释放之前有效 最后一个引用离开作用域之前都有效
作用域控制 static 限制于本文件有效 , extern 寻找其他文件的全局变量 大写开头可以导出, 小写仅限本包使用

指针


假设a 是一个指向某结构体的指针,这个结构体中有个成员叫b

CGo
a->b a.b
  • 取指针& 运算符 和解指针 * 运算符是一样的.
  • 在指针比较中, Go 中的 nil 等效C语言的 NULL .

函数

返回值

CGo
只能有一个 可以有多个

比如:

func exchange( a int , b int ) ( int , int ){
 return b , a
}
  • 1
  • 2
  • 3
  • 4

闭包

CGo

C 语言的函数和变量是两个不同的概念, 变量仅可以通过函数指针的形式来标识一个函数.
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))
 }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

PO


XCGo
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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • Interface
    定义接口,说明函数类型
type IOOTest interface {
 GetAByPointer() int 
}
  • 1
  • 2
  • 3

使用的时候将实现了对应的接口的结构体对象指针赋值给接口对象

var i_test IOOTest
var test OOTest 
i_test = &test
  • 1
  • 2
  • 3
  • Combination
    没啥子好说的

  • Inherit ( by anonymous combination )

type OOTest1 struct{
 OOTest
 b int
}
  • 1
  • 2
  • 3
  • 4

这样 OOTest1 就拥有了 OOTest 的成员变量和方法

并发


XC/C++Go
实现 依赖系统接口的线程 go 关键字, goroutine协程
依赖系统提供或者库或者自己实现 sync包
通讯 共享内存/消息 消息 chan机制

项目管理


XC/C++Go
编译器 自行挑选 自带
工程管理 自行挑选 自带
测试机制 自行挑选 自带
统一编码格式 依赖程序员自觉 工具统一整理

原文地址

http://studygolang.com/wr?u=http%3a%2f%2fblog.csdn.net%2fcchd0001%2farticle%2fdetails%2f44982127


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:xuybin

查看原文:Go 语言 与 C 语言 的比较学习

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
4164 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏