C++程序员学习go基础语法

来源:互联网 发布:ico图标制作软件 编辑:程序博客网 时间:2024/04/28 09:24

概念差异:

1.Go没有继承和虚函数,但是提供接口interface。
2.Go有指针,但是没有指针算术。
3.Go提供垃圾回收。不需要delete
4.Go的字符串类似C++的const char*。无法被修改。
5.Go少数类型是引用传递。
6.Go的对外可见是以大小写定义头字母的来识别的。C++中是Public,private。
7.Go禁止隐式类型转换。
8.Go不支持函数重载和运算符重定义。
9.Go使用nil表示无效指针。
10.左大括号{必须在当前行。
11.局部变量通过&返回是有效的,和C++不一样!即return new(Data) 等价于return &Data{} 

0.命名规范以及缩进

1.行末没必要有分号 ; 。

2.对外变量或函数首字母大写。

3.命名规范我本人参考的http://studygolang.com/articles/2059

1.变量

1.基础类型

var a int8 = 3

var a int16 = 3

var a int32 = 3

var a int64 = 3

var a uint8 = 3

var a uint16 = 3

var a uint32 = 3

var a uint64 = 3

var a float32 = 3

var a float64 = 3

var a int64 = 3

var a int8 = 3

var a int16 = 3

var a int32 = 3

var a int64 = 3

var a string  = "asd"

var a byte =  'v'

2.枚举

const(

_ = iota

a //1

b //2

)

3.type

type str string

2.控制语句

1.if

if  youcode {

}

2.for

for i:=1; i < x; i++{

//不支持前置++

}

for{} //无限循环

3.switch

var int32 a = 3

switch {

case 1 == a:

case 3 != a:

default:

}

没必要break,会直接返回。

3.函数

1.带参数和返回值

func(inputdata int32)(outputdata int32){

}

2.无返回值

func(inputdata int32){

}

3.变参

func(inputdata ...int32)(outputdata ...int32){

}

4.defer

defer 后的语句会在函数执行之前执行。

4.结构

1.type A struct {

}

有点类似C++的用法。

2.函数实现

func(p *A){

}

5.接口

1.interface

只要实现了接口里面的所有函数,就是实现了接口,没有必要类似C++来继承。

6.包管理

1.import(

)

这个很好理解,类似C++。但是要遵循Go的文件结构。

package 名字和import里面的名字必须一致。

2. 循环依赖问题

Go是不支持循环依赖的。但是我们可以将模块向外暴露的成员用接口封装起来。使两个类间的依赖变成对对方接口的依赖。从而避开了包的循环依赖。

7.数组

0.先说分配

有两种方法:

new(T):申请空间并返回一个T*值。

make(T,args):只生成切片,映射,信道,返回一个T值。

1.array

array := [...]int32{1,2,3,4,5}

GO的数组为值,如果想用的,建议用*来传递。

GO的数组和JAVA类似,自带长度,不需要额外的数值来保存。

2.slice

切片封装数组,相当于传递一个数组的指针。

3.map

类似STL的map,但是数组和切片不可以用作key,因为其类型未定义。

map是引用类型。

map[type] type{}

8.异常

1.Go使用异常机制,需要三个关键字 defer recover panic

例子如下:

func exception() {
    defer func() {
        fmt.Println("defer")
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()
    panic(100)
}
func main() {
    exception()
}

捕获异常之后,函数会直接在defer里面返回

9.并发

1.go程

可以理解为协程。某些时候可以当作线程来用,但是比线程要方便并且易于理解。

go func() 就可以直接运行

2.channels(信道)

var c = make(chan int)

var c = make(chan int, 10)//缓冲信道

一般可用于两个go程之间通信

3.mutex

加锁,和一般的加锁没有什么区别。

4.once

once.Do(func) 保证这个函数只在第一次调用,一种花式的全局静态的感觉。


10.init函数

1.每个源文件可以定义自身的init()函数来安排一些动作。在初始化完成后执行。发生在包里的所有变量初始化之后,发生在所有的包导入之后。

11.库API链接

1.http://studygolang.com/static/pkgdoc/index.html


最后附上:

package main
import (
    "fmt"
)
func main() {
    fmt.Println("Hello World!")
}


0 0