Go Lang

1 Go 的基础组成有以下几部分

  • 包声明
  • 引入包
  • 函数
  • 变量
  • 语句&表达式
  • 注释
package mainimport "fmt"func main(){ /**/ fmt.Println("hello,world!") }

  • 每个 Go 应用程序都包含一个名为 main 的包
  • fmt 包实现了格式化 IO(输入/输出)的函数
  • 下一行 func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。
  • 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )
  • 需要注意的是 { 不能单独放在一行,所以以下代码在运行时会产生错误:
  • Go Lang
    文章图片
【Go Lang】···
文件名与包名没有直接关系,不一定要将文件名与包名定成同一个。
文件夹名与包名没有直接关系,并非需要一致。
同一个文件夹下的文件只能有一个包名,否则编译报错。
···
Go 语法基础 Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号。如以下 GO 语句由 6 个标记组成:
Go Lang
文章图片

Go Lang
文章图片

数据类型 Go语言变量 声明变量的一般形式是使用 var 关键字:
var identifier type

package mainimport "fmt" function main(){ var a string = "Runoob" fmt.Println(a)var b,c int = 1,2 fmt.Println(b,c)

变量声明
  • 第一种,指定变量类型,如果没有初始化,则变量默认为零值
  • 第二种,根据值自行判断变狼类型
  • 第三种,省略var,注意:=左侧如果没有声明新的变量,就产生编译错误
intVal := 1 // 此时不会产生编译错误,因为有声明新的变量,因为 := 是一个声明语句

相当于
var intVal int intVal =1

多变量声明
//类型相同多个变量, 非全局变量 var vname1, vname2, vname3 type vname1, vname2, vname3 = v1, v2, v3var vname1, vname2, vname3 = v1, v2, v3 // 和 python 很像,不需要显示声明类型,自动推断vname1, vname2, vname3 := v1, v2, v3 // 出现在 := 左侧的变量不应该是已经被声明过的,否则会导致编译错误// 这种因式分解关键字的写法一般用于声明全局变量 var ( vname1 v_type1 vname2 v_type2 )

值类型和引用类型
Go语言常量
const identifier [type] = value

多个相同类型的声明可以简写为:
const c_name1, c_name2 = value1, value2

常量还可以用作枚举
const ( Unknown = 0 Female = 1 Male = 2 )

iota
iota,特殊常量,可以认为是一个可以被编译器修改的常量。
iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。
iota 可以被用作枚举值:
const ( a = iota b = iota c = iota )

package mainimport "fmt"func main() { const ( a = iota//0 b//1 c//2 d = "ha"//独立值,iota += 1 e//"ha"iota += 1 f = 100//iota +=1 g//100iota +=1 h = iota//7,恢复计数 i//8 ) fmt.Println(a,b,c,d,e,f,g,h,i) }

package mainimport "fmt" const ( i=1<
文章图片

Go 语言条件语句 switch
switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。
switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break。
switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough 。
switch var1 { case val1: ... case val2: ... default: ... }

Go语言循环 for 循环
for init; condition; post{}

for condition{}

for{}

for 循环的range格式可以对slice、map、数组、字符串等进行迭代循环
for key,value := range oldMap{ newMap[key] = vaule }

package main import "fmt"func main() { strings := []string{"google", "runoob"} for i, s := range strings { fmt.Println(i, s) }numbers := [6]int{1, 2, 3, 5} for i,x:= range numbers { fmt.Printf("第 %d 位 x 的值 = %d\n", i,x) } }

Go 语言函数
func function_name( [parameter list] ) [return_types] { 函数体 }

返回多个值
package mainimport "fmt"func swap(x, y string) (string, string) { return y, x }func main() { a, b := swap("Google", "Runoob") fmt.Println(a, b) }

函数参数
默认情况下, Go语言使用的事值传递,即再调用过程中不会影响到实际参数
函数用法
  • 函数作为另外一个函数的实参
    package mainimport ( "fmt" "math )func main(){ getSquareRoot := func(x float64) float64{ return math.Sqrt(x) }fmt.Println(getSquareRoot(9)) }

  • 闭包
    Go 语言支持匿名函数,可作为闭包。 匿名函数是一个”内联“语句或表达式。匿名函数的优越性在于可以直接使用函数内部的变量,不必申明。
package mainimport "fmt"func getSequence() func() int { i:=0return func() int { i+=1 return i } }func main(){ nextNumber := getSequence()fmt.Println(nextNumber()) fmt.Println(nextNumber()) fmt.Println(nextNumber())nextNumber1 := getSequence() fmt.Println(nextNumber1()) fmt.Println(nextNumber1())

  • 方法
Go语言变量作用域 作用域为以生命标识符所表示的常量、类型、变量、函数或包再源代码中的作用范围。
int -> 0 float32 -> 0 pointer -> nil

Go语言数组 声明数组
var variable_name [size] variable_type

var balance [10] float32

初始化数组
var balance = [5]float32{100.0,2.0.3.4,7.0,50.0}

balance := [5]float32{1000.0,2.0,3.4,6.0,50.0}

如果数组长度不确定,可以使用 ... 代替数组的长度,编译器会根据元素个数自行推断数组的长度:
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0} 或 balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

如果设置了数组的长度,我们还可以通过指定下标来初始化元素:
//将索引为 1 和 3 的元素初始化 balance := [5]float32{1:2.0,3:7.0}

多维数组
var variable_name [size1][size2]...[sizeN] variable_type

var threadim [5][10][4]int

初始化二维数组
a := [3][4]int{ {0,1,2,3}, {4,5,6,7}, {8,9,10,11}, }

注意:以上代码中倒数第二行的 } 必须要有逗号,因为最后一行的 } 不能单独一行,也可以写成这样:
a := [3][4]int{ {0, 1, 2, 3} ,/*第一行索引为 0 */ {4, 5, 6, 7} ,/*第二行索引为 1 */ {8, 9, 10, 11}}/* 第三行索引为 2 */

向函数传递数组
方式一
设置形参大小
void myFunction(param [10]int) { ... }

方式二
未设置数组大小
void myFunction(param []int) { ... }

    推荐阅读