《Go语言从入门到精通》Go语言快速入门_第1页
《Go语言从入门到精通》Go语言快速入门_第2页
《Go语言从入门到精通》Go语言快速入门_第3页
《Go语言从入门到精通》Go语言快速入门_第4页
《Go语言从入门到精通》Go语言快速入门_第5页
已阅读5页,还剩104页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Go语言快速入门Go语言从入门到精通快速掌握Go语言的基本写法快速浏览Go语言的基本要素,为下一步深入学习做准备01GRAMMAR02HELLOWORLD03BROWSEtarget目标运行起第一个Go语言程序目录导航3.13.23.3初识Go语言——编写、编译和运行Go语言程序的组织关键字等语言要素……ContentsGo语言程序源代码文件的存放位置与环境变量GOPATH相关如果GOPATH设置为C:\goprjs,那么源代码都将在C:\goprjs\src下的不同子目录中Go语言代码文件的命名Go语言代码文件的文件名后缀(扩展名)为.go名字可以任意取系统允许的文件名Go语言代码文件的输入1使用LiteIDE集成开发环境Go语言代码文件的输入2输入Helloworld!程序代码实际上,使用任何文本编辑器都可以编辑Go语言代码Go语言代码文件的编译1使用gobuild命令进行编译,得到可执行文件hello.exeGo语言代码文件的编译2goinstall命令将在GOPATH/bin(即C:\goprjs\bin)目录下生成可执行文件hello.exeGo语言程序的执行1直接运行Go语言编译后的可执行文件Go语言程序的执行2运行GOPATH/bin目录下的可执行文件,需要事先将GOPATH/bin加入到环境变量PATH中Go语言程序的执行3直接用gorun命令运行代码验证gorun执行的机制gorun的本质是先编译后执行packagemainimport( "fmt" "os")funcmain(){fmt.Println("Helloworld!")dir,_:=os.Executable()fmt.Println(dir)}查看Go语言文档1goget-v/x/tools/cmd/godoc新版Go语言默认不安装godoc,需自行安装运行godoc命令后,用访问本机的6060端口查看Go语言文档2访问官网的文档:/doc/访问标准库和第三方库的文档:https://pkg.go.dev/目录导航3.13.23.3初识Go语言——编写、编译和运行Go语言程序的组织关键字等语言要素……ContentsGo语言中的程序文件的组织方式目录文件包三要素main包的作用main的包是一个特殊的包,表示该包编译后会生成一个可执行文件;如果要编写一个能够被编译成可执行文件的程序,则代码必须是在main包中main包中可以使用其他包main包中不论有多少文件,其中的main函数有且只能有一个main包中的main函数引用其他包的方法——import调用其他包中的函数——包名+“.”+函数名fmt是标准中的一个包,主要用于输入、输出信息main包中的main函数packagemain

import( "fmt")

funcmain(){ fmt.Println("Helloworld!")}main包内main函数调用其他文件中的函数packagemain

import( "fmt")

funcmain(){ hello()}main.go文件main包中的其他文件sub.go文件小写开头的函数可以在本包内被访问非执行包packagepackage1

import( "fmt")

funcHello(){ fmt.Println("Helloworld!")}包名只有首字母大写的函数和变量可以被其他包访问package1/package1.go文件调用非执行包packagemainimport( "package1")funcmain(){ package1.Hello()}包名+“.”+函数名hello/main.go文件调用非执行包非执行包目录名与包名可以不一致但不建议这样做,最好一致以避免混乱用多级子目录组织有关联关系的包目录导航3.23.33.4……Go语言程序的组织关键字等语言要素变量……Contents关键字(保留字)“关键字”(keyword)的概念,有时候也叫做“保留字”(reservedword)所谓的“保留”,可以理解成不能作为其他用途使用,例如不能用作变量名或函数名。例如前面遇到的package、import、func

等目录导航3.33.43.5……关键字等语言要素变量表达式……Contents变量的概念变量就是编写程序时存放数据的地方,由于存放的数据可以随时改变,所以叫作“变”量(variable)Avariableisastoragelocationforholdinga

value.变量的类型整数——0,1,99,-30小数——2.3,-19.6*小数在编程中一般称为浮点数文字(又称字符串):abc,天气真好布尔(boolean)类型:true,false*布尔类型只有两个相反的值,可以对应真/假、是/否、对/错等对立的概念变量名与变量值变量名只是一个记号,标志着一个存放数值的地方变量值才是指其中实际存放的数据的取值变量声明与赋值Go语言是“强类型”的语言

必须先声明(定义)变量才可以使用声明变量最大的作用是明确它的类型声明一个整数类型的变量a令a等于10等号“=”在编程中的意义数学中,“=”等号表示相等编程中,“=”表示赋值,即让左边的变量中的值为等式右边的值数学上是错误的编程中却是常用的正确写法最后输出11Go语言中变量的快捷声明与赋值方法:=操作符的含义Go语言自动根据后面的数值推测该变量的类型,然后进行赋值小提示:Go语言每条语句后无需加分号“;”变量不能重复声明

包括用:=操作符的短声明

下面的例子实现了交换变量a与b的数值的作用多个变量同时赋值

a

:=

18

b:=

33

a,

b

=

b,

a

fmt.Println(a,

b)浮点数类型的变量计算机中对数学中的小数一般称作浮点数通过小数点的浮动来表示更大范围的小数Go语言中浮点数有两种:float32和float64float64更被推荐使用浮点类型变量示例同时声明多个变量多个变量同时赋值同时赋值多个变量在Go语言中也是允许的字符串类型的变量程序将输出goodmorning字符串变量的声明类型是string字符串变量的赋值要加双引号字符串变量也支持用:=简化声明并赋值加号“+”表示连接前后两个字符串布尔类型的变量变量b的值将为false布尔变量的声明类型是bool布尔变量只有true或false两个可能的取值!操作符用于将布尔值“取反”,即如果是true则变为false,反之亦然正确的变量命名xmyFirstNameplan_for_2017错误或者不建议使用的变量命名12——变量名字不能用数字开头codeName张三——变量名字最好不使用中文a#6——变量名字不能含有大多数英文字符和数字之外的特殊字符,建议最多只用下划线“_”

thisredapple——变量名字中不能有空格复合类型变量——切片(slice)切片用于在Go语言中表示一组数值Go语言的切片类型融合了其他语言中的静态数组(固定长度)和动态(可变长)数组的特性切片的声明、分配空间和赋值切片有类型之分给切片中的某一项赋值小提示:这里切片的用法类似其他语言中的静态数组给切片增加数据项append用于向切片末尾增加数据项从切片中截取数据项subAry将为[4,8]小提示:截取时不写左边的索引数字表示从头开始,不写右边的表示截取到末尾从高级截取与合并append第二个参数加…,表示将整个切片添加在ary的末尾subAry最终的结果将为[2,4,8,2,4]复合类型变量——映射(map)映射用于表示其他语言中常称作字典(dictionary)的复合数据类型通常由字符串来进行索引,这个字符串被称为“键(key)”而由该键所索引的位置里存放的具体数据就叫做“值(value)”映射是由一个个“键值对(key-valuepair)”组成的映射的声明、分配空间和赋值键值对小提示:映射类型分配的空间会自动增长,并非上限映射的声明、分配空间和赋值Go语言特色用法,变量ok将是值为false的布尔类型变量其他复合类型Go语言中还有自定义数据类型(struct)和用于并发处理的通道类型等,将在后续介绍严格的变量类型控制int(整型)和int64(64位整型)居然不能相加变量类型的转换

可以互相转换的类型,直接用类型名加括号的方式就可以转换错误的变量类型转换Go语言编译器不知道怎样将float64类型转换为布尔类型float64类型与布尔类型不相容Go语言中的指针类型变量

相较于C/C++语言中的指针做了一定的改进,主要是相对更安全p是int类型的指针变量取变量a的地址向指针变量p指向的地址内赋值最后变量a中的值为20指向复杂类型变量的指针切片也可以这样简化声明并赋初值指向int类型切片的指针变量向指针变量p指向地址的序号为1的项赋值最后变量a中的值为[1,8,3]

仅声明但未经赋值的变量中,保存的是“零值”(zerovalue)变量的零值数字的零值一般为0布尔变量的零值是false字符串的零值是空字符串指针变量的零值是空指针nil切片和映射的零值是空切片或空映射目录导航3.43.53.6……变量表达式函数(方法)……Contents

计算机编程中指的是一连串用运算符或操作符连接各个数值组成的式子其中的数值也可以是变量或函数,只要最后能够计算出某个值表达式可以嵌套表达式通过计算最终可以得到一个值,叫做表达式的值单个数值、变量、函数也可以看作是表达式表达式(expression)的概念

Anexpressionspecifiesthecomputationofavaluebyapplyingoperatorsandfunctionstooperands.表达式的最主要的用途a=a+1表达式变量变量的作用是保存数值,表达式最终可以计算出一个数值,因此表达式可以被赋值给变量注意:返回多个数值的函数可以被看作数组或切片的复杂类型数值表达式中的括号a*(12-b)改变运算的优先级使用嵌套的圆括号是正确的写法并且可以多级嵌套编程中不能使用数学中的方括号或花括号13-[8-(6+3)]13–(8-(6+3))目录导航3.53.63.7……表达式函数(方法)自定义数据类型……Contents函数

函数的主要作用是将输入的参数进行一定的运算处理后形成输出的结果。输入参数和输出结果均可以是零至多个调用函数Go语言安装时就附带了标准库,其中的函数可以直接使用(仅需先导入相应的包)包名fmt.Println(1+2)函数名输入参数这里是一个表达式,最终会计算出一个值,因此是一个参数调用函数Go语言安装时就附带了标准库,其中的函数可以直接使用(仅需先导入相应的包)包名fmt.Println(1+2)函数名输入参数这里是一个表达式,最终会计算出一个值,因此是一个参数该函数将输出3小提示:同一个包内定义的函数调用时无需加包名自己编写函数

编写函数的最主要的目的是为了减少重复劳动package

main

import

(

"fmt")

func

addTwice(a

int,

b

int)

int

{

return

a

+

b

+

b}

func

main()

{

c

:=

addTwice(1,

2)

fmt.Println(c)}定义函数的方式调用函数并利用其输出值/返回值的方式自定义函数的注意事项用关键字func开始自定义一个函数;函数的名字与变量命名的要求基本一致;函数名后面圆括号中定义了本函数接受的各个输入参数及其类型;如果函数有输出值(返回值),在函数圆括号后应标明返回值的类型;函数内部的所有代码应包含在一个花括号(大括号)中;如果函数有返回值,必须至少有一条return语句来返回结果值,每一个return语句都是该函数代码执行的终结点,意味着return语句返回结果值后将不再往下执行其他代码。如果函数没有返回值,也可以用不带返回值的return语句来返回(强制终止函数的运行);返回多个结果值的函数package

main

import

(

"fmt")

func

swapNumber(a,

b

int)

(int,

int)

{

return

b,

a}

func

main()

{

n1

:=

1

n2

:=

2

n3,

n4

:=

swapNumber(n1,

n2)

fmt.Println(n3)

fmt.Println(n4)}“废弃”函数的返回值package

main

import

(

"fmt")

func

swapNumber(a,

b

int)

(int,

int)

{

return

b,

a}

func

main()

{

n1

:=

1

n2

:=

2

n3,

_

:=

swapNumber(n1,

n2)

fmt.Println(n3)}使用下划线Go语言的内置函数预先定义好,无需引用/导入任何包,例如println目录导航3.63.73.8……函数(方法)自定义数据类型面向对象编程……Contentstype

MyInt

int

func

main()

{

var

a

MyInt

a

=

10

b

:=

MyInt(12)

c

:=

a

+

b自定义数据类型用type关键字来定义新的数据类型……使用时需要转换type

Person

struct

{

Name

string

Gender

string

Age

int}

func

main()

{

var

a

Person

a.Name

=

"张三"

a.Gender

=

"男"

a.Age

=

25自定义复合数据类型用type加struct关键字定义复合数据类型类似C/C++等语言中的“结构体”……用结构变量名+“.”+成员变量名来访问type

Person

struct

{

Name

string

Gender

string

Age

int}

func

main()

{

a

:=

new(Person)

a.Name

=

"张三"

a.Gender

=

"男"

a.Age

=

25new关键字的应用……新建一个结构指针(引用)并分配空间此时的a是指针类型的变量type

Person

struct

{

Name

string

Gender

string

Age

int}

func

main()

{

a

:=

new(Person)

a.Name

=

"张三"

a.Gender

=

"男"

a.Age

=

25

fmt.Println(a)new关键字的应用……新建一个结构指针(引用)并分配空间,此时的a是指针类型的变量将输出&{张三男25}目录导航3.73.83.9……自定义数据类型面向对象编程条件判断与分支……Contents面向对象编程的基本概念对象是对事物进行分类的一种方法一般来说,对象类表示分类,例如“人”、“男人”;对象实例(有时候也直接简称为对象)代表对象类中的具体个体,例如“小明”、“张三”等每个对象类都可以包含属性和方法,例如“人”都有“名字”这个属性,也有“走路”这个方法,而具体对象实例“张三”的名字属性的值就是“张三”面向对象编程是在编程的设计和编码阶段,把所有涉及到的内容均看作一个个“对象”来处理的方法论Go语言中面向对象的实现方式:声明对象类数据type

Person

struct

{

Name

string

Gender

string

Age

int}先定义数据结构,也就是定义对象类的名称(Person)和对象类的成员变量们func

(p

*Person)

say(sentence

string)

{

fmt.Print(p.Name,

"

says

",

sentence,

"\n")}

func

(v

Person)

getAge()

int

{

return

v.Age}定义成员函数再定义对象类的方法,也就是定义对象类的成员函数们func

main()

{

person1

:=

&Person{Name:

"Tom",

Gender:

"male",

Age:

25}

person1.say("Hello!")

person1.Name

=

"Jerry"

person1.say("Hello!")}Go语言中面向对象的实现方式3然后就可以创建对象实例,访问对象类的成员变量,或者调用对象类的成员函数Go语言中面向对象的实现方式3func

(p

*Person)

say(sentence

string)

{

fmt.Print(p.Name,

"

says

",

sentence,

"\n")}

func

(v

Person)

getAge()

int

{

return

v.Age}成员函数定义在指针和值上的区别一般来说,需要改变对象数据的函数,应该定义在指针上,否则定义在值上目录导航3.83.93.10……面向对象编程条件判断与分支循环……Contents

a

:=

10

b

:=

15

if

a

>

b

{

fmt.Println(a

-

b)

}

else

{

fmt.Println(b

-

a)

}基本的条件判断分支

a

:=

10

b

:=

10

if

a

>

b

{

fmt.Println(a

-

b)

}

else

if

a

<

b

{

fmt.Println(b

-

a)

}

else

{

fmt.Println("a

=

b")

}多重分支

a

:=

10

b

:=

15

if

a

>

b

{

fmt.Println("a

>

b")

fmt.Println(a

-

b)

}

else

{

if

a

==

b

{

fmt.Println("a

=

b")

}

else

{

fmt.Println(b

-

a)

}

}嵌套分支目录导航3.93.103.11……条件判断与分支循环并发处理:Go例程(goroutine)……Contents

for

i

:=

0;

i

<

10;

i

++

{

fmt.Println(i)

}基本的循环经典的“三段for循环”

for

i

:=

0;

i

<

10;

i

++

{

fmt.Println(i)

}基本的循环经典的“三段for循环”,输出:

i

:=

0

for

i

<

10

{

fmt.Println(i)

i++

}for循环的变体

a

:=

[]string{"abc",

"def",

"zzz"}

for

i,

v

:=

range

a

{

fmt.Println(i,

"

:

",

v)

}

for循环结合range遍历数组

a

:=

[]string{"abc",

"def",

"zzz"}

for

i,

v

:=

range

a

{

fmt.Println(i,

"

:

",

v)

}

for循环结合range遍历数组或切片(slice)

a

:=

[]string{"abc",

"def",

"zzz"}

for

i

:=

0;

i

<

3;

i++

{

v

:=

a[i]

fmt.Println(i,

"

:

",

v)

}

等价的三段for循环

a

:=

map[string]int{"Number1":

1,

"Number2":

2,

"Number3":

4}

for

k,

v

:=

range

a

{

fmt.Println(k,

"

:

",

v)

}

for循环结合range遍历映射(map)目录导航3.103.113.12……循环并发处理:Go例程(goroutine)注释……Contentsfunc

routine1(index

int)

{

for

i

:=

0;

i

<

10000000000;

i++

{

fmt.Println(index,

":

",

i)

}}

func

main()

{

go

routine1(1)

go

routine1(2)

for

i

:=

0;

i

<

10000000000;

i++

{

fmt.Println("0:

",

i)

}}Goroutine——Go语言特色的并发方式func

routine1(index

int)

{

for

i

:=

0;

i

<

10000000000;

i++

{

fmt.Println(index,

":

",

i)

}}

func

main()

{

go

routine1(1)

go

routine1(2)

for

i

:=

0;

i

<

10000000000;

i++

{

fmt.Println("0:

",

i)

}}Goroutine——Go语言特色的并发方式轻量级,启动快于一般的线程占用系统资源少,轻易启动上千个goroutine可以使用原生的“通道”来避免并发冲突支持透明的防线程阻塞机制Goroutine的特点目录导航3.113.123.13……并发处理:Go例程(goroutine)注释程序编译或运行时出现错误怎么办……Contents基本的单行注释

h

:=

175

//

h代表身高

//

下面这句话输出的是标准体重

fmt.Println((h

-

80)

*

0.7)多行注释

a

:=

18

for

a

>

0

{

fmt.Println("a=",

a)

a

=

a

-

1

/*

a

=

a

+

2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论