Go语言3小时光速入门01——基础

go语言安装

怎么安装这个应该没必要说了吧。。。

👉go语言官网
不出意外的话,常年处于被墙状态...

👉go语言中文网

如果打不开官网可以在中文网中下载:

👉官网下载

👉中文网下载

安装时建议勾选上环境变量设置,免的自己去手动设一遍(虽然后面还是要手设)

GOPATH

  1. 在 1.8 版本前必须设置这个环境变量量
  2. 1.8 版本后(含 1.8)如果没有设置使⽤用默认值
    在 Unix 上默认为 $HOME/go
    在 Windows 上默认为 %USERPROFILE%/go
    在 Mac 上 GOPATH 可以通过修改 ~/.bash_profile 来设置

Hello World!

按照所有编程语言的惯例我们先来看看Golang中的Hello World:

HelloWorld.go

//包,所在包 目录名可以不是main但是package名必须是main
package main

//导包
//在golang中导入的包必须要使用否则会报错
import (
	"fmt"
	"os"
	//可以通过下划线"_"将不使用的包标记为缺省
	_"io"
)

/*
	函数入口
	GO中main不支持返回值,不支持函数参数
	os.Exite(0)来返回状态
	os.Args获取命令行参数
*/
func main()  {
	//打印输出hello world
	fmt.Println("Hello World!")
	//获取参数
	if len(os.Args) > 1{
		fmt.Println(os.Args)
	}
	//返回状态
	os.Exit(0)
}

Go语言的基本结构

所有go语言源文件由.go结尾。

go语言的命名推荐使用驼峰命名法,必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线。

和Java一样Go中有包的概念,并且都是从main()函数开始执行,main()函数作为整个程序的入口。跟Java不同的是:go中执行文件包名必须是"main"(也就是上面代码中开始的package main),但是所在的文件夹名不一定是真的是main。如:在teach文件夹下的HelloWorld.go中可以设置package main
即程序入口:

1.必须是 main 包:package main
2.必须是 main ⽅方法:func main()
3.文件名不不一定是 main.go

go语言中语句结尾可以不写分号,可基于换行来确定语句

Go语言中的导包

go语言通过import(和Java相似),导入外部的其他包。注意:go语言中不允许存在缺省包(即导入了但是并未使用)。可以通过下划线"_"来表明缺省表示自己并不关心(同理在函数返回等也可以这样使用)。详细的可以见后面go语言包管理部分。

Go语言中函数定义

go语言中支持多参数,可选参数,多返回值。
go中通过func关键词定义,相当于kotlin中的fun和python中的def。

函数定义如下:
func 函数名(参数名1 参数类型1,参数名2 参数类型2,...)(返回值类型1,返回值类型2,...){

return 返回值1,返回值2,...
}

与java不同,在传入参数时,参数名在前,类型在后。
当返回值小于等于一个时可以省略括号。如:func funcDemo(arg int){}

*在go语言中所有参数都是值传递(在slice,map,channel使用过程中可能会有引用传递的错觉,但其实不是,有兴趣的话可以详细了解)

在go语言中函数本身也可以作为参数进行传递

main函数传参与返回

在上面的代码中我们可以看到,main函数其实是没有参数和返回值的。当我们需要获取启动时参数时可以通过os.Args返回一个字符串数组,获取启动时参数。(相当于java中main方法的string数组参数,传入方法也相同)。

当我们需要在go程序运行完返回时可以通过os.Exit(返回状态码)来返回状态

Go语言的访问控制

go语言中根据首字母的大小写来确定可以访问的权限。无论是方法名、常量、变量名还是结构体的名称,如果首字母大写,则可以被其他的包访问(类似于java中的public);如果首字母小写,则只能在本包中使用(类似java中的private)。所以要注意大写小写在go语言中都是有特殊含义的。

Go语言的注释

Go语言使用 C++风格的注释:

//表示单行注释,到行尾结束

/…/表示多行注释。

Go语言中的测试程序

对软件的组成单元进行测试,最小单位:函数

我们可以将:

1.源码⽂文件以 _test 结尾:xxx_test.go

2.测试⽅方法名以 Test 开头:func TestXXX(t *testing.T) {…}

来构建一个简单的测试程序(这样我们就不用在学习时每次从main函数作为入口执行了,而是通过指定函数进行单元测试型执行,这样可以提高学习效率降低复杂度,后面的例子中将会大量统一的使用这种方法)

unit_test.go文件:

func TestFn(t *testing.T){
	t.Log("hello world!")
}

Go语言中的基本类型

类型说明
int(8/16/32/64)8/16/32/64位整数类型
uint(8/16/32/64)8/16/32/64位无符号整数类型
byte字节类型(相当于uint8别名)
bool布尔类型
string字符串类型
runeUnicode字节类型(相当于int32别名)
float(32/64)32/64位浮点类型
complex(64/128)64/128实数和虚数
uintptr无符号整型,用于存放一个指针

如图,go语言中int又按照长度分为int8,int16,int32,int64(uint,float等同后面的数字表示长度)

默认值:

整型的默认值0
浮点型的默认值0
字符串的默认值""
布尔类型的默认值false

类型的最大最小预定值

  1. math.MaxInt32,math.MinInt32
  2. math.MaxFloat64,math.MaxFloat64
  3. math.MaxUint32,math.MaxUint32

相当于Java中的Integer.MAX_VALUE等

Go语言的变量与常量

变量

在go语言中变量的定义有多种方法:
1. var 变量名 变量类型
2. 变量名 := 变量值 
3. var 变量名 变量类型 = 变量值 

变量定义:
var x int
x := 0
var x int = 0
以上三种定义等价

局部变量还是全局变量取决于变量定义位置(函数内还是go文件中)以及变量名首字母的大小写

go中通过 := 可以进行自动类型推断,如x:=123等价于var x int = 123

在⼀个赋值语句中可以对多个变量进行同时赋值,如我们可以通过x,y = y,x快速交换两个变量的值

常量

go语言中通过 const关键字对常量进行赋值。

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

一般的var可以省略,变量类型可以用 = 自动推导如:

const(
 var a int = 0
 int b = 1;
 c = 2;
 //....
)
上面三种定义了常量a,b,c

其中在定义常量时可以通过iota进行自动步进,位移等操作,如

const(
	//iota等于0
	x1 = iota + 1
	x2
	x3
	x4
	x5
)
上面定义了x1到x5,5个常量,其值分别为1到5

const(
	Disable = 1 << iota
	Read
	Write
	ALL
)
通常我们通过位移来表示不同的状态
上面定义了4个常量,每个按照对应二进制位设置为1

Go语言中类型别名

go语言中通过type关键字来定义一个类型的别名。

type 别名 数据类型

如:

type long int64

上面将long设置为一个int64类型的别名。即
var a long = 123 相当于定义了一个 相同实现的 var a int64 = 123

Go语言中的基本类型转换

Go语言对数据类型有严格要求,并不支持隐式类型转换(包括别名)

在go语言中可以通过

类型(要转换的变量或表达式)

的方式强行转换类型,如:

m := 10
n := 3

f := float64(m/n)

上面将m/n的结果强转为float64类型

Go语言中的指针类型

go语言中使用*类型来表示一个类型的指针类型,通过&变量来获取一个变量的指针。

intValue := 10

//定义一个int的指针类型变量intPoint,并获取intValue 的指针赋值
var intPoint *int = &intValue 

与C/C++不同的是go语言不支持指针运算
string 是值类型,其默认的初始化值为空字符串,而不是 nil

Go语言中的运算符

关系运算符

运算符说明
==检查两个值是否相等,如果相等返回 True 否则返回 False
!=检查两个值是否不相等,如果不相等返回 True 否则返回 False
>检查左边值是否大于右边值,如果是返回 True 否则返回 False
<检查左边值是否小于右边值,如果是返回 True 否则返回 False
>=检查左边值是否大于等于右边值,如果是返回 True 否则返回 False
<=检查左边值是否小于等于右边值,如果是返回 True 否则返回 False

逻辑运算符

运算符说明
&&与,逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False
||或,逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False
!非,逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True
!=不等于,检查两个值是否不相等,如果不相等返回 True 否则返回 False

算术运算符

运算符说明
+
-
*
/
%
++自增
--自减

位运算符

运算符说明
&按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进制位相与
|按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进制位相或
^按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1
<<左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0
>>右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数
&^按位置零,将运算左侧的二进制位对应的第右侧位置为0.(非常好用)

与Java不同在Go语言中==可以用于比较两个数组的内容是否相等,但是只有当两个数组的元素个数相等才可以比较。当两个数组元素全部相等时返回True.

在Go语言中只有后置的自增和自减a++,a--没有前置的++a,--a

Go语言中的条件语句

if语句

在Go语言中if语句没有太大的变化和python基本相同,比java/c++少个括号.

if 条件表达式{
//逻辑代码
}else 条件表达式2{
//...
}

if 基本赋值语句,条件表达式{
//逻辑代码
}

如:
if a == 0{

}else{

}

if a:=321; a > 123{

}

switch

switch表达式基本格式一:

switch 表达式{

匹配表达式1:
	//...
	//注意这里没有break
匹配表达式2:
	//...
匹配表达式3:
	//...
default:

}

如:

switch "233"{

case "322":

case "332":

defalut:


}
同样在switch的表达式前可以定义基本赋值语句

switch表达式格式二:

switch {
case 表达式1:
//...
case 表达式2:
//...
case 表达式3:
//...
}

表达式结果必须是true或false
上面这种写法相当于if...else...

注意:

go语言中条件表达式不限制为常量量或者整数;

单个 case 中,可以出现多个结果选项, 使用逗号分隔;

与 C语言等规则相反,Go 语言不需要用break来明确退出一个 case;

Go语言中的循语句

go语言中只支持for关键字的循环,没有while。

go中的for与其他与Java中的基本一致,只是少个括号。

for 赋值语句;循环条件;循环后步进操作{

}

如:
for i:=0; i < 100; i++{
}

其中比较特殊的,go语言中for后面的表达式都可选

i := 0
for i < 99 {
i++
fmt.Println(i)
}

上面代码相当于while(i < 999){}


for {
…
}

上面代码相当于while(true){}

更新时间:2020-02-20 15:15:29

本文由 寻非 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://www.zhouning.group/archives/go语言3小时光速入门01基础
最后更新:2020-02-20 15:15:29

评论

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×