第5课:Go语言基础知识

勿在浮沙筑高台,想学好一门语言,记清楚基础知识还是必要的,如若不然,总是因为基本知识翻手册,查网络,效率会降低很多

1.变量赋值:
var a
a := 12
a,b :=12,23

i := 123
j := int32(123)
变量i是int类型,在内存中占用一个32位的存储单位。只有指针才会在64位的机器上占用更多的空间——int始终是32位——然而我们仍然可以选择64位的系统。变量j是int32类型,因为它经过了显式的类型转化。尽管i和j有着同样的内存布局,但它们的类型是不一样的:像这样的赋值i = j会产生类型异常,必须通过显式的类型转换:i = int(j) 

2.字符串:
一个字符串在内存中的表示被分成两段,一个指向字符串数据的指针和一个长度值
Go中string是常量,只能用双引号来表示。
a := "www.godeye.org"
a[0] = 'c' (这个是错误的,会报错)
如果要做上面的操作应该这样:	
a := "this is godeye"
c := []bytes(a)
c[0] = 'c'
d := string(c)

3.array, slice和map
array就是平时使用的数组,和C语言中的数组是一样的
var a [10]int
a[0] = 1
a[1] = 2

二维数组:
a := [2][2]int{{1,2}, {3,4}}
slice和array接近,slice理解为array的指针,使用make进行内存分配
sl := make([]int, 10)

4.数值转型
将一个数值从一个类型转换为另一个类型称为一次转型,其语法形式有点类似函数调用:
uint8(intVar) //截断到相应的大小
int(float64Var) //片段截断
float64(intVar) //转为float64

5.声明
golang声明以一个关键字开头(var, const,type和func),并且与C中的声明次序相反:
var i int
const PI = 22./7.
type Point struct { x, y int }
func sum(a, b int) int { return a + b }

6.结构和指针
type Point struct {X, Y int}
定义一个叫Point的简单的结构类型,意味着内存里是两个相邻的int
p := Point{10, 20}
pp := &Point{10, 20}
Point{ 10, 20 }这句复合语法表示一个被初始化的Point对象。而&Point{ 10, 20 }这句则表示一个指向被初始化的Point对象的指针。前者在内存中有两个数据块,而后者则存放着一个指向两个数据块的指针

7.循环和选择结构:
Go中没有do while,循环结构只有for。选择结构有if和switch
if语句
if err := file.Chmod(777); err != nil {
    return err
}
切结:左括号必须和if在同一行

for循环(支持单一条件循环,多条件循环与无条件循环即死循环)
sum := 0
for i := 0; i < 10; i++ {
    sum += i
}
list := []string{"aaa", "Godeye", "ccc"}
for _,v := range list{
    fmt.Print("%s", v)
}
//这里使用了一个range,key和value分别是int和string类型,key是序号,从0开始,value是值
range是go语言系统定义的一个函数。函数的含义是在一个数组中遍历每一个值,返回该值的下标值和此处的实际值。
假如说a[0]=10,则遍历到a[0]的时候返回值为0,10两个值
for _,v := range list其中的_下划线表示舍弃索引也就是上面a数组中的0舍弃掉

switch语句
switch和其他语言差不多,只有一个,它不需要break,查询到一个满足条件的,执行,然后跳出
switch a {
    case "test1":
        fmt.Print("test1")
    case "test2","test3":
        fmt.Print("testOhter")
    default:
        fmt.Print("www.godeye.org")
}


8.函数
函数以func关键字开头。
如果有返回类型,返回类型放在参数的后面。return的含义和你期望的一致。
func square(f float64) float64 { return f*f }

函数支持返回多个值。这样,返回类型就是一个括号包围的列表。
func MySqrt(f float64) (float64, bool) {
    if f >= 0 { return math.Sqrt(f), true }
    return 0, false
}

9.0是什么?new和make的区别
0值取决于类型:数值是0;布尔是false;空字符串是"";指针,map、切片、channel是nil;结构体是0等。

Go有两种创建数据结构的方法:new和make,基础的区别在于,new(T)返回一个*T类型,一个可以被隐性反向引用的指针,而make(T,args)返回一个原始的T,它并不是一个指针