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

9 篇文章 0 订阅

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

关键字


分类CGo
字符char
字符串string
浮点数double , floatfloat32 , float64 , complex64 , complex128
整数int long shortuint8 , uint16 , uint32 , uint64 , int8 , int16 , int32 , int64 , uint , int , uintptr , byte = uint8 , rune=unit32
boolboolean true , false
函数func
接口interface
void
Anyinterface{}
聚合enum , struct , unionstruct
符号限定符号signed , unsigned , auto , const , extern , register , static , volatileauto , const
流程控制break , case , do , for , goto , if , else , continue , default , return , switch , whilefor , if , else , goto , break , switch , case , default , fallthrough , range , select , range
数据结构map
其他sizeof , typedefiota , 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->ba.b
  • 取指针& 运算符 和解指针 * 运算符是一样的.
  • 在指针比较中, Go 中的 nil 等效C语言的 NULL .

函数

返回值
CGo
只能有一个可以有多个

比如:

func exchange( a  int , b int ) ( int , int ){
    return b , a
}
闭包
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))
    }
}

PO


XCGo
if“if ( condition) XXX else XXX“`“`if condition {XXX} else {XXX}
switch只能选择可以转化为整形的 , case中没有break自动继续可以任意类型, 不会自动继续, 除非使用failthrough
select是个函数关键字, 选择chan
forfor ( ; ; ) XXXfor ; ; {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 的成员变量和方法

并发


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

项目管理


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值