go语言学习 一

Go语言学习

1.包 每个go语言程序都是由包来构成的,程序从main包开始运行,

package main

import (

    "fmt"

    "math/rand"

)

func main() {

    fmt.Println("My favorite number is", rand.Intn(10))

}

每个程序都是从main包开始运行的,这个程序我们引入了两个外来的包,一个是fmt,一个是math/rand,这里的import引入包我来理解是和我们c语言里边的头文件是相似的,这里边包含了一些已经封装的函数我们直接使用就可以。当有多个包引入的时候像我们上边的情况我们也可以用另外的方式来实现多个包的引用。

import “fmt”

Import “math” 不过分组导入的话更好一些代码看起来更加整洁一些。

在go语言里边有导出名的概念,如果一个名字是大写字母开头那就说明他是已经导出的。fmt是go语言里边十分常用的一个包,这个包包含了基本的输入输出函数和我们的iostream有些类似。上边用到的是println函数这个函数在我看来是类似于cout的他没有那些格式化的输出,如果要是在go语言里边用c语言里边的格式化输出就

就需要用到printf函数来进行格式化输出,大部分东西和我们c语言都是一样的

比如这个程序中的math里边的Pi他就是一个导出名,当我们把p小写的时候就会报错

这时候会提示pi没有定义。

其实我最初看到这个的时候我就想这简直就是说的屁话 你文件里边定义的是Pi你在外边引用pi引用个锤子怎么能引用呢,但是后来发现一个问题他和c语言不一样在go里边就像我们刚刚说的文件即使math里边有pi你也是不能使用的,这和c++里边的公有私有的思想是一样的,如果一个变量或者说函数开头字母是大写的说明他是一个可以被外边引用的人所看到的变量,如果说你的函数或者变量开头是小写的说明你这个是一个私有的,外部的人是不能调用 看不到的。

对于go语言变量和函数的声明刚看的时候是一件很别扭的事情,因为变量在定义的时候都需要加上var声明 并且类型和数据顺序和c语言里边恰好是相反的。

对于基础的变量的声明

//声明初始化一个变量 

var x int = 100 

 var str string = "hello world”

/声明初始化多个变量 

var i, j, k int = 1, 2, 3 

 //不用指明类型,通过初始化值来推导

 var b = true //bool型

 

当我们想要定义变量的时候需要先用var关键字来说明,然后 当我们在c语言里边定义的时候我们是使用

int x=100 类型前边 然后变量名在后边 之后是他的值但是go语言里边恰巧是相反的,当我们在定义int类型的变量的时候 var x int =100 类型名和变量名字反了过来 只是一个简单的交换位置而已,当有多个变量的时候在后边制定一个类型就可以了,当定义的变量是内置类型的时候也可以不指明具体的类型,通过初始化的类型推导出来对应的类型。

还有一种定义变量的方式

x := 100 //等价于 var x int = 100;

对那些已经确定初始值的变量可以采用这种定义方式。

const s string = "hello world"

const pi float32 = 3.1415926

当我们定义常量的时候就需要使用const关键字来修饰对应的变量

 

对于数组的定义和初始化

1 func main() {

2     var a [5]int

3     fmt.Println("array a:", a)

4 

5     a[1] = 10

6     a[3] = 30

7     fmt.Println("assign:", a)

8 

9     fmt.Println("len:", len(a))

10 

11     b := [5]int{1, 2, 3, 4, 5}

12     fmt.Println("init:", b)

13 

14     var c [2][3]int

15     for i := 0; i < 2; i++ {

16         for j := 0; j < 3; j++ {

17             c[i][j] = i + j

18         }

19     }

20     fmt.Println("2d: ", c)

21 }

这个程序里边我们定义了一个数组大小为5的int类型的数组。对于数组的初始化和c语言是类似的,也可以像b那样直接在定义的时候进行初始化,对于二位数组的初始化用for循环来实现,这里的for循环唯一的不同就是没有了小括号

在go语言里边还有一个对数组的切片操作,类似于我们c++里边用迭代器来初始化数组

1 a := [5]int{1, 2, 3, 4, 5}

2 b := a[2:4] // a[2] 和 a[3],但不包括a[4]

3 fmt.Println(b)

4 b = a[:4] // 从 a[0]到a[4],但不包括a[4]

5 fmt.Println(b)

6 b = a[2:] // 从 a[2]到a[4],且包括a[2]

7 fmt.Println(b)

很像c++里边的用迭代器进行初始化一个数组,这里是左闭右开的初始化,如果:前边没有制定就从第一个开始到后边制定数字的前一个,如果是后边没有制定则从前边制定的数字开始一直到最后一个数据。

//if 语句

if x % 2 == 0 {

    //...

}

//if - else

if x % 2 == 0 {

    //偶数...

} else {

    //奇数...

}

//多分支

if num < 0 {

    //负数

} else if num == 10 {

    //零

} else {

    //正数

}

对于if语句来说 和c语言最大不同就是没有小括号,其他都是一样的,不过这个书写格式是固定的,很多人在写c语言的时候很不习惯将花括号放在if语句后边而是另换一行,这里我在go语言里边进行测试如果另换一行的话是不能编译通过的,到底为什么等下和大家详细的介绍。

switch i {

    case 1:

        fmt.Println("one")

    case 2:

        fmt.Println("two")

    case 3:

        fmt.Println("three")

    case 4,5,6:

        fmt.Println("four, five, six")

    default:

        fmt.Println("invalid value!")

}

其实学过c的话 想看懂简单的go语言代码还是比较简单的,因为一些关键字都是相同的,这里也是用的switch语句不过在c语言学习初期大家很多都才过了break的坑,在go语言里边不需要break就可以直接跳出,并且在case后边可以有多个值,也就是多个值有同一个选项的时候很方便使用,

//经典的for语句 init; condition; post

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

     fmt.Println(i)

}

//精简的for语句 condition

i := 1

for i<10 {

    fmt.Println(i)

    i++

}

//死循环的for语句 相当于for(;;)

i :=1

for {

    if i>10 {

        break

    }

    i++

}

对于for循环的使用主要是三种常见的方式,第一种就是我们正常的使用方式不过这种还是要记住不要加小括号,第二种和我们c语言里边的while循环比较类似,所以go语言里边是没有while语句的,都用for循环来代替了,第三种就是while 1的情况 在for循环层它是一个死循环。

接下来咱们就说一下go语言另外一个特殊的点,看过上边go语言的代码如果研究仔细的话可以看出来go语言里边是没有分号的,我们之前写的c语言c++在每一句话之后都会有分号,但是go语言却没有,那go语言是怎么来判别每一句话和每一句话的间隔的呢?go语言也是通过分号来判别的,不过这个分号是不需要程序员老加入的,这些分号都是有词法分析器在扫描源代码的过程中使用简单的规则自动插入分号,因此输入源代码的时候就不需要输入分号了,他的大致规则是这样的,如果一个新行的前方的最后一个标记是一个标识像int这种、是一个基本的数值或者是break continue这些会自动插入分号。所以无论什么时候都不可以将if、for、switch、select等这些借口的左大括号放在下一行,不然会在打括号前边自动插入一个分号,这样就会产生一些不想要的结果。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页