GO语言补充

常量的定义

常量的值在编译时就已经确定
常量的定义格式与变量基本相同
等号右侧必须是常量或者常量表达式
常量表达式中的函数必须是内置函数

常量的初始化规则与枚举

在定义常量组时,如果不提供初始值,则表示将使用上行的表达式
使用相同的表达式不代表具有相同的值
iota是常量的计数器,从0开始,组中每定义1个常量自动递增1
通过初始化规则与iota可以达到枚举的效果
每遇到一个const关键字,iota就会重置为0


运算符

Go中的运算符均是从左至右结合

优先级(从高到低)

^      !                                               (一元运算符)
*       /    %    <<    >>    &      &^
+      -     |      ^                         (二元运算符)
==   !=   <    <=    >=    >
<-                               (专门用于channel)
&&
||

指针

Go虽然保留了指针,但与其它编程语言不同的是,在Go当中不支持指针运算以及”->”运算符,而直接采用”.”选择符来操作指针目标对象的成员

操作符”&”取变量地址,使用”*”通过指针间接访问目标对象
默认值为 nil 而非 NULL

递增递减语句

    在Go当中,++ 与 -- 是作为语句而并不是作为表达式

判断语句if

条件表达式没有括号
支持一个初始化表达式(可以是并行方式)
左大括号必须和条件语句或else在同一行
支持单行模式
初始化语句中的变量为block级别,同时隐藏外部同名变量
1.0.3版本中的编译器BUG

循环语句for

Go只有for一个循环语句关键字,但支持3种形式
初始化和步进表达式可以是多个值
条件语句每次循环都会被重新检查,因此不建议在条件语句中
使用函数,尽量提前计算好条件并以变量或常量代替
左大括号必须和条件语句在同一行

其实,就是简化编写,将while封装了起来,只使用for,if就可以了。

选择语句switch

可以使用任何类型或表达式作为条件语句
不需要写break,一旦条件符合自动终止
如希望继续执行下一个case,需使用fallthrough语句
支持一个初始化表达式(可以是并行方式),右侧需跟分号
左大括号必须和条件语句在同一行

注意,GO语言中的switch语句支持表达式了,很强大。


跳转语句goto, break, continue

三个语法都可以配合标签使用
标签名区分大小写,若不使用会造成编译错误
Break与continue配合标签可用于多层循环的跳出
Goto是调整执行位置,与其它2个语句配合标签的结果并不相同

看到这里,GO语言真正的震撼到我了,我在GO语言中,看到了汇编、C/C++、JAVA、PYTHON等多种语言的影子,我感受到了,它想要将多种语言的优点集于一身的努力!


数组Array

定义数组的格式:var <varName> [n]<type>,n>=0
数组长度也是类型的一部分,因此具有不同长度的数组为不同类型
注意区分指向数组的指针和指针数组
数组在Go中为值类型
数组之间可以使用==或!=进行比较,但不可以使用<或>
可以使用new来创建数组,此方法返回一个指向数组的指针
Go支持多维数组

注意,在比较数组的时候,保证的前提是需要a1数组和a2数组的长度相等,否则会将其视为不同类型,无法比较。

于是,这里我试了一下,可不可以将其“数组强制类型转换”之后进行比较,实践证明,这样是不行的。

在这里,用GO语言写一个冒泡排序:

package main

import "fmt"

func main() {

    a := [...]int{
  5, 2, 6, 3, 9}

    fmt.Println(a)

    num := len(a)

    for i := 0; i < num; i++ {

        for j := i + 1; j < num; j++ {

            if a[i] > a[j] {
                temp := a[i]
                a[i] = a[j]
                a[j] = temp

            }

        }

    }

    fmt.Println(a)

}