GO语言:第三节

105 阅读4分钟
//数组

/*
数组的长度是固定的,不可改变。
var s = [3]int{1, 2, 3} ---var s [3]int = [3]int{1, 2, 3}
q := [...]int{1, 2, 3}
如果...出现在标明数组长度的位置,那么数组的长度由初始化时数组里元素的个数决定。

需要注意的是[3]int和[2]int并不属于同一个数据类型
如果两个数组属于同一个数据类型,它们就可以用==来进行比较
m := [2]int{1} ---未初始化的部分会使用该元素类型的空值(int:0,string:"",指针:nil)
n := [...]int{1, 2}
m == n ---比较两个数组中的元素是否全相等

r := [...]{99: -1} ---定义了数组r,有100个元素,最后一个元素是-1,其余的是空值(0)。

当数组作为参数传递给函数时,函数将会复制整个数组。

*/
//slice

/*
slice通常写出[]T,其中元素类型都是T。
slice表示一个拥有相同类型元素的可变长度的而序列。
数组和slice紧密关联,slice用来访问数组里部分或者全部元素,而这个数组称为slice的底层数组。
slice有三个属性:指针,长度和容量。
指针指向底层数组可访问的第一个元素的地址。(所以这个元素可以不是底层数组的第一个元素)
长度指slice中的元素个数。( len(sliceName)返回长度 )
容量指指针指向的元素到底层数组最后一个元素的个数。( cap(sliceName)返回容量 )
显然一个底层数组可以对应多个slice,且slice之间可以重叠。
slice操作符s[i:j]
months := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
q := months[4, 7] ---[4 5 6]
所以q的len:3,cap:9

s := []int{1, 2, 3, 4, 5}
这种声明方式表示创建一个底层数组和一个slice。slice长度与容量相等,指针指向底层数组第一个元素。

内置函数make可以创建一个具有指定元素类型,长度和容量的slice。
其中容量参数可以省略,这样长度就和容量相等
make([]T, len)
make([]T, len, cap)

内置append函数用来将元素追加到slice的后面,增加slice的长度。
如果长度超出了容量,就新创建一个底层数组将之前的数据复制过去。
var x []int
x = append(x, 1)
x = append(x, 1, 2, 3)
x = append(x, x...) ---追加x中的所有元素

*/
//map

/*
map:拥有键值对元素的无序集合。
map[k]V 其中k是键的数据类型,V是值的数据类型。
ages := map[string]int {
    "Tom": 31,
    "Lisa": 33,
}
等价于
ages := make(map[string]int)
ages["Tom"] = 31
ages["Lisa"] = 33

delete(ages, "Tom") ---根据键来移除元素

age, ok := ages["Tom"]
查找键Tom对应的值,如果没有传回当前类型空值,ok记录是否成功查询到。

若没有给定的键在map中,就返回值类型的零值
*/
//结构体

/*
type Employee struct {
    ID int
    Name string
}
var tom Employee
结构体通过.来访问其内部成员
tom.ID = 12
tom.Name = "Tom"
等价于
tom := Employee{12, "Tom"}

需要注意的是指针也是通过.来访问的
tomPtr := &tom
tomPtr.Name = "TOM"
等价于
(*tomPtr).Name = "tom"

如果结构体的所有成员变量都可以比较,那么这个结构体就是可比较的。
可以用==或者!=。
*/
//for 循环

/*
在Go中只有for这一个循环结构

for {
    body
}
表示死循环

for a <= b {
    body
}

for i := 0; i <= 10; i++ {
    body
}

for ; ; {
    body
}
表示死循环

nums := []int{1, 2, 3, 4}
for i, j := range nums {
    body
}
range nums返回两个参数,第一个是下标,第二个是对应下标的值。
不想使用可以用占位符_替换i或者j
*/
//switch

/*
基本用法
switch var {
    case var1:
        ....
    case var2:
        ....
    ....
    ....
    ....
    default:
        ....
}
*/

package main

import "fmt"

func main() {
   /* 定义局部变量 */
   var grade string = "B"
   var marks int = 90

   switch marks {
      case 90: grade = "A"
      case 80: grade = "B"
      case 50,60,70 : grade = "C"
      default: grade = "D"  
   }

   switch {
      case grade == "A" :
         fmt.Printf("优秀!\n" )    
      case grade == "B", grade == "C" :
         fmt.Printf("良好\n" )      
      case grade == "D" :
         fmt.Printf("及格\n" )      
      case grade == "F":
         fmt.Printf("不及格\n" )
      default:
         fmt.Printf("差\n" );
   }
   fmt.Printf("你的等级是 %s\n", grade );
}
//if

/*
if a == b {
    ...
}else if a == c {
    ...
}else {
    ...
}
*/