Go语言基本语法(上)| 青训营笔记

465 阅读7分钟

一、Go 语言简介

Go语言全称为Golang,是Google公司自主研发的一款开源编程语言,从2007年由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。

Go语言由于其简洁、安全、内存管理和编译迅速等特点,现已在各个互联网公司中广泛应用。Go语言一般来说用在以下几个方面:

  1.         搭载 Web 服务器
    
  2.         存储集群或类似用途的巨型中央服务器
    

由于其提供的海量并行的支持,Go语言运用在游戏服务器的开发中是非常合适的,现在不管是腾讯还是米哈游,在游戏服务器的开发上,都能看到Go语言的身影~

二、Go 语言基础语法

1.Go程序基本结构

  • 包声明
  • 引入包
  • 函数
  • 变量
  • 语句 & 表达式
  • 注释

举个简单的例子:

package main  
  
import "fmt"  
  
func main() {  

   fmt.Println("Hello, World!")  
}

让我们来简单剖析一下这个程序:

1.第一行代码 package main 定义了包名。在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。

2.下一行 import fmt 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。

3.下一行 func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。

4.下一行 fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。这一点和java中的输出非常相似,可以参考java中的输出。

需要注意的是 { 不能单独放在一行!!!! 否则会报错,这一点又和c/c++,java不同。

2.格式化字符串

Go 语言中使用 fmt.Sprintffmt.Printf 格式化字符串并赋值给新串:

  • Sprintf 根据格式化参数生成格式化的字符串并返回该字符串。
  • Printf 根据格式化参数生成格式化的字符串并写入标准输出。

看一段代码:

package main  
  
import (  
    "fmt"  
)  
  
func main() {  
   // %d 表示整型数字,%s 表示字符串  
    var number = 123  
    var name = "kiki"  
    var url="%d is %s's favourate number"  
    var str1 = fmt.Sprintf(url, number, name)  
    fmt.Println(str1)  
}

输出结果为:123 is kiki's favourate number

3.变量声明

Go语言的变量声明有三种常用的方法:

1.指定变量类型,如果没有初始化,则变量默认为零值

举个例子:

package main  
import "fmt"  
func main() {  
  
    // 声明一个变量并初始化  
    var a = "yolo"  
    fmt.Println(a)  
  
    // 没有初始化就为零值  
    var b int  
    fmt.Println(b)  
  
    // bool 零值为 false  
    var c bool  
    fmt.Println(c)  
}

输出结果为:

yolo
0
false

第二种,根据值自行判定变量类型。

举个例子:

package main  
import "fmt"  
func main() {  
    var d = true  
    fmt.Println(d)  
}

输出结果为:

true

第三种,使用:=代替var

num := 1等价于

val num int
num = 1

4.Go语言常量

(1)const

Go 语言中,const的用法和c++里面的差不太多哇,这里就不写了,偷懒~~~

(2)iota

iota,特殊常量,可以认为是一个可以被编译器修改的常量。

iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。

举个例子:

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

输出结果为:

0 1 2 hhhh hhhh 100 100 7 8

5.Go 语句条件语句

Go的条件语句和c++的都差不多啊,但是这里要着重看一下switch,这个和c++的有一些区别,用法要多元一些,让我们来看一下吧~~

switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break

switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough

6.Go 语句循环语句

Go 语言的循环语句,更像是c++和python的结合体。额。。。要是没学过python的话,来划个重点吧~~

Go 语言中循环语句是不带括号的,这也是Go 语言比较方便的原因之一吧。Go 语言的for循环一般来说有三种格式,

1.for init; condition; post { }

2.for condition { }

3.for { }

for循环中的range格式可以对数组、map、slice等进行迭代循环。格式如下:

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

如果只是想读取key值或者是value值,可以采取以下办法:

for key := range oldMap

如果是只读取value的值,则可以这样:

for _, value := range oldMap

7.Go 语言函数

Go 语言的函数写法和c++的相比,主要是格式上有一些变化,然后就是可以返回多个值。

Go 语言函数定义格式如下:

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

Go 函数可以返回多个值,举个例子:

package main  
  
import "fmt"  
  
func swap(x, y string) (string, string) {  
   return y, x  
}  
  
func main() {  
   a, b := swap("Google", "Baidu")  
   fmt.Println(a, b)  
}

输出结果为:

Baidu Google

8.Go 语言数组

go语言的数组声明和c++差别稍微大一些,但是应该和python差不太多。

Go 语言数组声明需要指定元素类型及元素个数,语法格式如下: var variable_name [SIZE] variable_type

数组初始化,举个例子:

var nums = [4]float32{100.0, 23.2, 3.44, 31.0, 89.29}

如果数组长度不确定,可以使用 ... 代替数组的长度,编译器会根据元素个数自行推断数组的长度:

nums := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

如果设置了数组的长度,我们还可以通过指定下标来初始化元素:

//  将索引为 2 和 4 的元素初始化
balance := [5]float32{2:2.0,4:7.0}

9.Go 语言指针

(1)指针的定义

Go语言中指针的概念和c++的一致的,在Go 中,指针的定义格式如下:

var var_name *var-type

举两个实际例子:

var a *int        /* 指向整型*/
var b *float32    /* 指向浮点型 */

(2)空指针

当一个指针被定义后没有分配到任何变量时,它的值为 nil nil在概念上和null、nullptr、NULL是一样的。

三、实践练习例子:

(1)guessing-game

这个项目就是简单的猜数字游戏,需要注意的是生成随机数的时候,要加上时间戳,这样才能使每次生成的数都是随机的。

图片.png

(2)simpledict

这个在线字典的项目,要注意的是整个抓包的过程,第一次接触的话,会比较吃力(比如我)

(3)proxy

不会,开摆

明天好好学一下,看了下视频,应该是涉及到计网的知识。

四、课后个人总结:

今天是字节青训营的day1,学了一些Go语言的基础语法,然后跟了三个项目,但是明显感觉到后两个项目难度比较大,再加上自己对Go语言并不熟悉,所以学起来会比较吃力,需要静下心来学。

五、引用参考: