02.手撕Go语言-基础

第一个Go程序

02.01.png

解读:

a. package

Go源文件开头必须使用package声明代码所属包,包是Go代码分发的最基本单位。若程序需要运行包名必须为main。

b. import

import用于导入程序依赖的所有的包。此程序依赖于fmt包。

c. func

func用于定义函数。main函数是程序的入口,若程序需要运行必须声明main函数,main函数无参数也无返回值

d. fmt.Println

调用fmt.Println函数将参数信息打印到控制台

编译&运行

a. go build: 用于编译&链接程序或包

go build -work -x -o helloworld.exe main.go

b. go run:用于直接运行程序

go run -work -x main.go

c. go clean:清除编译文件

常用参数:

  • -x: 打印编译过程执行的命令,并完成编译或运行
  • -n: 只打印编译过程执行命令
  • -work:打印编译过程的临时目录
  • -o: 指定编译结果文件

程序结构

Go源文件以package声明开头,说明源文件所属的包,接着使用import导入依赖的包,其次为包级别的变量、常量、类型和函数的声明和赋值。函数中可定义局部的变量、常量

基本组成元素

标识符

标识符是编程时所使用的名字,用于给变量、常量、函数、类型、接口、包名等进行命名,以建立名称和使用之间的关系,Go语言标识符的命名规则:

  1. 只能由非空字母(Unicode)、数字、下划线(_)组成
  2. 只能以字母或下划线开头
  3. 不能Go语言关键字

建议:

  1. 避免使用Go语言预定义标识符
  2. 建议使用驼峰式

说明

  1. 标识符区分大小写

Go语言提供一些预先定义的标识符用来表示内置的常量、类型、函数,在自定义标识符时应避免使用:

  • 内置常量:true、false、nil、iota
  • 内置类型:bool、byte、rune、int、int8、int16、int32、int64、uint、uint8、unit16、unit32、unit64、uintptr、float32、float64、complex64、complex128、string、error
  • 内置函数:make、len、cap、new、append、copy、close、delete、complex、real、imag、panic、recover
  • 空白标识符:_

关键字

关键字用于特定的语法结构,Go语言定义25关键字:

  • 声明:import、package
  • 实体声明和定义:chan、const、func、interface、map、struct、type、var
  • 流程控制:break、case、continue、default、defer、else、fallthrough、for、go、goto、if、range、return、select、switch

字面量

字面量是值的表示方法,常用与对变量/常量进行初始化,主要分为:

  • 标识基础数据类型值的字面量,例如:0, 1.1, true, 3 + 4i, 'a', "我爱中国"

  • 构造自定义的复合数据类型的类型字面量,例如:type Interval int

  • 用于表示符合数据类型值的复合字面量,用来构造array、slice、map、struct的值,例如:{1,
    2, 3}

操作符

  • 算术运算符:+、-、*、/、%、++、--
  • 关系运算符:>、>=、<、<=、==、!=
  • 逻辑运算符:&&、||、!
  • 位运算符:&、|、、<<、>>、&
  • 赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
  • 其他运算符:&(单目)、*(单目)、.(点)、-(单目)、…、<-

分割符

小括号(), 中括号[],大括号{},分号;,逗号,

声明

声明语句用于定义程序的各种实体对象,主要有:

  • 声明变量的var
  • 声明常量的const
  • 声明函数的func
  • 声明类型的type

变量

变量是指对一块存储空间定义名称,通过名称对存储空间的内容进行访问或修改,使用var进行变量声明,常用的语法为:

  • var 变量名 变量类型 = 值

定义变量并进行初始化,例如:var name string = "silence"

  • var 变量名 变量类型

定义变量使用零值进行初始化,例如:var age int

  • var 变量名 = 值

定义变量,变量类型通过值类型进行推导,例如: var isBoy = true

  • var 变量名1, 变量名2 , …, 变量名n 变量类型

定义多个相同类型的变量并使用零值进行初始化,例如:var prefix, suffix string

  • var变量名1, 变量名2 , …, 变量名n 变量类型 = 值1, 值2, …, 值n

定义多个相同类型的变量并使用对应的值进行初始化,例如:var prev, next int = 3, 4

  • var变量名1, 变量名2 , …, 变量名n = 值1, 值2, …, 值n

定义多个变量并使用对应的值进行初始化,变量的类型使用值类型进行推导,类型可不相同,例如:var name, age = "silence", 30

  • 批量定义

    var (
        变量名1 变量类型1 = 值1
        变量名2 变量类型2 = 值2
    )
    

    定义多个变量并进行初始化,变量类型也可省略

    例如:

    var (
        name string = "silence"
        age int = 30
        height = 1.68
    )

初始化表达式可以使用字面量、任何表达式、函数

02.02.png

简短声明

在函数内可以通过简短声明语句声明并初始化变量,可通过简短声明同时声明和初始化多个变量,需要注意操作符左侧的变量至少有一个未定义过

02.03.png

赋值

可以通过赋值运算=更新变量的值,Go语言支持通过元组赋值同时更新多个变量的值,例如:n1, n2 = 1, 2,可用于两个变量的交换x, y = y,x

02.04.png

常量

常量用于定义不可被修改的的值,需要在编译过程中进行计算,只能为基础的数据类型布尔、数值、字符串,使用const进行常量声明,常用语法:

  • const 常量名 类型 = 值

定义常量并进行初始化,例如:const pi float64 = 3.1415926

  • const 常量名 = 值

定义常量,类型通过值类型进行推导,例如:const e = 2.7182818

  • 批量定义

    const (
        常量名1 类型1 = 值1
        常量名2 类型2 = 值2
    )
    

定义多个变量并进行初始化,变量类型也可省略,并且除了第一个常量值外其他常量可同时省略类型和值,表示使用前一个常量的初始化表达式

例如:

const (
    name string = "silence"
    age int = 30
)

const (
    name string = "silence"
    desc
)

常量之间的运算,类型转换,以及对常量调用函数len、cap、real、imag、complex、unsafe.Sizeof得到的结果依然为常量

02.05.png

作用域

作用域指变量可以使用范围。go语言使用大括号显示的标识作用域范围,大括号内包含一连串的语句,叫做语句块。语句块可以嵌套,语句块内定义的变量不能在语句块外使用

常见隐式语句块:

  • 全语句块
  • 包语句块
  • 文件语句块
  • if、switch、for、select、case语句块

作用域内定义变量只能被声明一次且变量必须使用,否则编译错误。在不同作用域可定义相同的变量,此时局部将覆盖全局

02.06.png

注释

Go支持两种注释方式,行注释和块注释:

  • 行注释:以//开头,例如: //我是行注释
  • 块注释:以/*开头,以*/结尾,例如:/*我是块注释*/
02.07.png

问题跟踪

最基本的问题跟踪方式为打印日志,我们可以fmt包中提供的Println、Print、Printf函数用于将信息打印到控制台,帮助我们进行问题调试,基本使用方法:

02.08.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容