Go语言基本语法

0x01 内建变量类型

  • boolstring

  • (u)int(u)int8(u)int16(u)int32(u)int64uintptr

  • byterune

  • float32float64complex64complex128

uintptr是指针类型,rune是字符类型(4字节,也就是解决了其他语言char的编码问题),complex复数类型(很神奇,其他语言没有)。

go语言中,我们使用复数的话,可以和数学中一样

a := 1 + 1i

这点和python有一点区别,python中使用j表示虚数。

go语言中的强制类型转换类似于c语言,使用type()即可。

0x02 变量的定义

通过var关键字声明变量

var variable type

和其他语言不同的是,go语言的变量类型是放在变量名之后的(为什么这样设计呢?)。并且go语言声明一个变量后会自动赋初值(这是一个不错的性质)。我们也可以自己赋初值,如下

var a int = 3

定义多个变量

var a, b int = 3, 4

同样作为一个新语言,go支持类型推导(类似于cppauto

var a, b = 3, "hello"

也可以这样写

var (
	a = 3
    b = "hello"
)

我们也可以将var省略,不过我们需要通过:=替代=(这种写法和python非常类似)

a, b := 3, "hello"

上述写法有一个限制必须在{}中使用。也就是对于包内的全局变量我们必须使用var定义。

0x03 常量的定义

常量的定义和cpp类似,使用const

const a = 3

const数值可作为各种类型使用,也就是对于一些操作我们不需要强转。例如

var c int = int(math.sqrt(a * a))

而如果a不是const的话,我们就需要这样写

var c int = int(math.sqrt(float64(a * a)))

我们可以使用const定义枚举类型

const (
	cpp = 0
    java = 1
    python = 2
)

我们可以使用iota简化上面的操作,iotago语言的常量计数器,会给被赋值给iota的变量赋初值0,后面的变量赋初值+1(类似于cpp中的enum

const (
	cpp = iota 	// 0
    java   		// 1
    python 		// 2
    _
)

其中_表示跳过,这点和python很像。

0x04 条件语句

go的条件语句和python类似,不用在if后添加括号

if condition {
} else {
}

go语言中的if还支持其他语言中的for类似功能

if a, b := 3, 3 ; a != b {
}

但是这里有一点要注意,我们不能像其他语言那样去声明一个变量(只能赋值)

if var a, b = 3, 3 ; a != b { 	// 	syntax error: var declaration not 
    							//	allowed in if initializer
}

go语言中的switch语法和其他语言不同,我们不需要写break(会自动添加)

switch var0 {
    case val1:
        ...
    case val2:
        ...
    default:
        ...
}

如果不想break的话,我们只需在break的位置添加fallthrough即可。

switch后面也可以不添加表达式

switch {
    case val1 == var0:
        ...
    case val2 == var0:
        ...
    default:
        ...
}

0x05 循环语句

写法上和其他语言类似,唯一的区别是不用写括号

for init; condition; post { }

initconditionpost都是可以省略的。

go语言中没有while关键字,但是我们可以使用for实现类似功能

for condition { }

也就是我们省略了initpost

go语言中我们也有for range的写法

for key, value := range oldMap {
    newMap[key] = value
}

0x06 函数

定义函数需要使用func关键字和python中的def类似。函数的定义与变量的定义类似,我们都是和其他语言反过来。

func function_name( [parameter list] ) [return_types] {

}

函数名在前面,返回类型在后面。

我们也可以返回多个值

func swap(x, y string) (string, string) {
   return y, x
}

如果其中一个返回值我们不想要的话,可以使用_替代(和python类似)

a, _ := swap(a, b)

复合函数的定义也非常简单

func apply(op func(int, int) int, a, b int) int {
    return op(a, b)
}

我们在上面定义了一个函数类型参数op。上面这种东西和python里面的装饰器很类似。上面函数的传入操作,我们可以使用匿名函数(go语言中没有lambda表达式)

func ( [parameter list] ) [return_types] {
}

也就是省略函数名。

go语言中支持可变参数列表

func sum(numbers ...int) int {
	s := 0
	for _, val := range numbers {
		s += val
	}
	return s
}

0x07 指针

指针的定义

var var_name *var-type

go语言中指针不能做计算,也就是不能++--,我们仅仅访问指针所指向的内容*var_name

go语言中空指针使用nil表示。

说道指针,那我们不得不谈引用,在go中参数通过值传递或者指针传递(没有引用,这是c语言的特性)。

你可能感兴趣的:(go)