【Go】go语言快速入门(一)

在C语言的基础上,微微的尝试入门go语言 - 基本语法。


Hello World

HelloWorld的代码如下:

1
2
3
4
5
6
7
8
package main  
  
import  "fmt"  
  
func main()  {  
	fmt.Println("Hello World!")  
	//hello world
}

代码段具体含义:

  • package声明包
  • import导入包
  • ”//”为注释,不编译
  • func main()_ 是程序开始执行的函数。
    • main 函数是可执行程序必须包含的,一般是启动后第一个执行的函数(init() 更优先)。 与C语言相比,每一行不需要语句结束后加“;”了,但一行代码中多条语句键要加“;”,且“{”不能另起一行。

变量与类型

数据类型

数据基本类型:

  • bool
  • byte
  • string
  • int / uint
  • float / complex
  • 注:指针为*type, 例如*int为int型的指针类型

数字类型: | uint8 | uint16 | uint32 | uint64 | | int8 | int16 | int32 | int64 |

浮点类型: | float32 | float64 | | complex64 | complex128 |

变量与常量

变量声明规则 :var identifier type

  • var 表示变量
  • indentifier 标识符/变量名
    • 当标识符以大写字母开头,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(需要先导入这个包),这被称为导出(像面向对象语言中的 public);
    • 标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。
  • type 变量类型

变量声明方法:

  • 指定变量类型,如果没有初始化,则变量默认为零值
    • var v_name v_type
    • var x int = 0
  • 根据值自行判定变量类型
    • var v_name = value
    • var x = false
  • 使用 := 声明变量
    • v_name := value
    • x := false
    • 注:如果变量已经用 var 声明过,再使用 := 声明变量会编译错误

常量声明规则 :const identifier type

  • 常量数据类型只能是基本数据类型(不能指针)
  • 其余与变量类似

基本运算符

其实运算符与C等语言基本一致。

算术运算

| + | -| * | / | % | ++ | -- | | 加 | 减 | 乘 | 除 | 取余 | 自增 | 自减 |

逻辑运算

| && | ||| ! | | 与 | 或 | 非 |

位运算

| & | || ^ | <<| >> | | 位与 | 位或 | 位异或 | 左移 | 右移 |

关系运算

| == | !=| > | < | >= | <= | -- | | 是否相等 | 是否不等 | 是否大于 | 是否小于 | 是否大于等于 | 是否小于等于 |

赋值运算

| += | -=| *= | /= | %= | | 加后赋值 | 减后赋值 | 乘后赋值 | 除后赋值 | 取余后赋值 | | &= | ^= | |= | <<= | >>=| | 位与后赋值 | 位或后赋值 | 位异或后赋值 | 左移后赋值 | 右移后赋值 | 例:C += A 等价于 C = C + A

地址与指针

| & | *| | 取地址 | 指针变量 |

运算符优先级

同级运算符运算顺序从左到右,

()括号内优先级提高,

下表中越靠上优先级越高:

  • * / % << >> & &^
  • + - | ^
  • == != < <= > >=
  • &&
  • ||

分支与循环

分支

if:逻辑真则执行括号内代码。

1
2
3
4
5
6
7
8
9
if bool {
	//	执行true时代码
}

if bool {
	//	执行true时代码
}else{
	//	执行false时代码
}
  • 与C语言相比,判断条件不用加括号了

switch:基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。

1
2
3
4
5
switch var1 {  
	case val1:  ...  
	case val2:  ...  
	default:  ...  
}
  • switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break。
  • switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough

select :随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行。一个默认的子句应该总是可运行的。

1
2
3
4
5
6
7
8
9
select  {  
	case communication clause :  
	statement(s);  
	case communication clause :  
	statement(s);  
	/* 你可以定义任意数量的 case */  
	default  :  /* 可选 */  
	statement(s);  
}

循环

go语言中for循环包括了while的使用,因此只有for循环。

while循环:

1
2
for condition {  }
//等价于C语言中while

for循环:

1
2
for init; condition; post {  }
//等价于C语言中for
  • init: 一般为赋值表达式,给控制变量赋初值;
  • condition: 关系表达式或逻辑表达式,循环控制条件;
  • post: 一般为赋值表达式,给控制变量增量或减量。
    1. 先对表达式 1 赋初值;
    2. 判别赋值表达式 init 是否满足给定条件:
    • 若其值为真,满足循环条件,则执行循环体内语句,然后执行 post,进入第二次循环,再判别 condition;
    • 否则判断 condition 的值为假,不满足条件,就终止for循环,执行循环体外语句。

      for range :可以对 slice、map、数组、字符串等进行迭代循环。

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

  • break用于循环语句中跳出循环,并开始执行循环之后的语句。
  • continue不是跳出循环,而是跳过当前循环执行下一次循环语句。
  • goto 语句可以无条件地转移到过程中指定的行。
    1
    2
    goto label; 
    label: statement;
    

至此已经可以完成最基本的程序了。