- , 13 2月 2023
- 作者 847954981@qq.com
- Go学习, 我的编程之路
Go语言学习笔记一 Golang的安装与基础
Go语言是一个静态强类型的语言 Go语言的安装与其他语言有所不同。通过官网下载压缩包(或msi)来自定义文件夹安装。
使用VsCode进行Go的编辑时需要注意:
环境变量Path中需要写明Go的地址。
添加Go插件后可能会报错GOROOT,解决方法为在插件的setting.json内添加GOROOT和GOPATH地址(貌似环境变量添加也行)
GOROOT为Go的安装目录,一般填写安装时的目录
GOPATH为Go的工作目录,必须与安装目录不同(一般在安装目录同级文件夹创建新文件夹)
Go语言语法事项
(1)源文件以”go”为扩展名。 (2)程序的执行入口是main()函数。 (3)严格区分大小写。 (4)方法由一条条语句构成,每个语句后不需要分号(Go语言会在每行后自动加分号),这也体现出Golang的简洁性。 (5)Go编译器是一行行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否则报错 (6)定义的变量或者import的包如果没有使用到,代码不能编译通过。 (7)大括号都是成对出现的,缺一不可
Go语言变量
go语言变量的标准定义方法为:
代码语言:javascript复制定义 变量名 类型=初始值
var age int = 18
如果没有定义初始值,则会使用默认值,如int类型默认值为0
如果没有定义类型,则会按照等号后的值来决定类型。如:
代码语言:javascript复制var age = 18 //类型为int
也可以省略var,在”=”前加上“:”,如:
代码语言:javascript复制age := 18 //类型为int
并且,Go支持一次性定义多个变量:
代码语言:javascript复制var age1,age2,age3 = 18,"123",12.5 //其他方式同理 同时可以使用:
var(
age1=10
age2=20
)
需要注意的是,Golang的变量严格匹配类型,如定义的int类型变量不能赋值小数,不然会报错。
变量数据类型
条件语句
Go语言中的条件语句语法为:
代码语言:javascript复制if 条件表达式1 {
逻辑代码1
} else if 条件表达式2 {
逻辑代码2
}
.......
else {
逻辑代码n
}
Go推荐的条件语句写法的条件表达式是不加括号的。
switch分支
switch语法为:
代码语言:javascript复制switch 表达式 {
case 值1,值2,.….:
语句块1
case 值3,值4,...:
语句块2
....
default:
语句块
}
与Java的区别为不需要break。
switch的注意事项
(1)switch后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以)
(2)case后面的值如果是常量值(字面量),则要求不能重复
(3)case后的各个值的数据类型,必须和 switch 的表达式数据类型一致
(4)case后面可以带多个值,使用逗号间隔。比如 case 值1,值2…
(5)case后面不需要带break
(6)default语句不是必须的,位置也是随意的。
(7)switch后也可以不带表达式,当做if分支来使用
(8)switch后也可以直接声明/定义一个变量,分号结束,不推荐
(9)switch穿透,利用fallthrough关键字,如果在case语句块后增加fallthrough ,则会继续执行下一个case,也叫switch穿透。(就像是java中不带break,但只会执行下面一个)
循环语句
在Go语言中,只有for循环,没有while和do..while循环
for循环语法:
代码语言:javascript复制for 初始表达式; 布尔表达式; 迭代因子 {
循环体;
}
go的for循环基本语法除了条件不用括号,其余与java没什么区别。
除了基础用法,for循环还有几种方式:
代码语言:javascript复制//格式灵活
func main(){
i := 1 //变量的初始化
for i<=5 {//条件表达式。判断条件
fmt.Println("你好 Golang")//循环体
i //迭代
}
}
//死循环
func main(){
//死循环:
// for {
// fmt.Println("你好 Golang")
// }
for ;; {
fmt.Println("你好 Golang")
}
}
for除了基础用法,还存在for range的迭代结构。
for range 可以遍历数组、切片、字符串、map 及通道,for range 语法上类似于其它语言中的 foreach 语句,一般形式为:
代码语言:javascript复制for key, val := range coll {
...
}
举个例子:
代码语言:javascript复制func main(){
//定义一个字符串:
var str string = "hello golang你好"
//方式1:普通for循环:按照字节进行遍历输出的 (暂时先不使用中文)
// for i := 0;i < len(str);i {//i:理解为字符串的下标
// fmt.Printf("%c n",str[i])
// }
//方式2:for range
for i , value := range str {
fmt.Printf("索引为:%d,具体的值为:%c n",i,value)
}
//对str进行遍历,遍历的每个结果的索引值被i接收,每个结果的具体数值被value接收
//遍历对字符进行遍历的
}
函数的使用
在Golang中使用函数的基本语法为:
代码语言:javascript复制func 函数名(形参列表)(返回值类型列表){
执行语句..
return 返回值列表
}
例子如下:
代码语言:javascript复制//自定义函数:功能:两个数相加:
func cal (num1 int,num2 int) (int) { //如果返回值类型就一个的话,那么()是可以省略不写的
var sum int = 0
sum = num1
sum = num2
return sum
}
函数注意点
(1)Go语言支持多返回值,函数头返回值的括号内定义每个返回值的类型即可。如:
代码语言:javascript复制func test() (int,int){
return 1,2
}
func main() {
a,b:=test()
}
(2)函数内存分析
有如下代码:
代码语言:javascript复制//自定义函数:功能:交换两个数
func exchangeNum (num1 int,num2 int){
var t int
t = num1
num1 = num2
num2 = t
}
func main(){
//调用函数:交换10和20
var num1 int = 10
var num2 int = 20
fmt.Printf("交换前的两个数: num1 = %v,num2 = %v n",num1,num2)
exchangeNum(num1,num2)
fmt.Printf("交换后的两个数: num1 = %v,num2 = %v n",num1,num2)
}
对于如上代码,我们一般意识是代码实现了num1与num2的交换,但打印的结果却相反。
这里是由于Go语言内存的特点,对于各个函数会在内存栈里开辟不同的栈帧,这里主函数调用其他函数,并传入变量,会使得变量的值传入其他函数的栈帧,而由于本质是不同栈帧,其余方法里的变量和main里的变量内存地址不同(即为不同变量),因此交换失败。
(3)Golang函数不支持重载,相同名称的函数会报错
(4)Golang支持可变参数:
代码语言:javascript复制//定义一个函数,函数的参数为:可变参数 ... 参数的数量可变
//args...int 可以传入任意多个数量的int类型的数据 传入0个,1个,,,,n个
func test (args...int){
//函数内部处理可变参数的时候,将可变参数当做切片来处理
//遍历可变参数:
for i := 0; i < len(args); i {
fmt.Println(args[i])
}
}
(5)基本数据类型和数组默认都是值传递的,在函数内修改,不会影响到原本的值。
(6)以值传递方式的数据类型,如果希望在函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量。从效果来看类似引用传递。如:
代码语言:javascript复制func test(a *int) {
*a = 20
}
func main() {
a := 10
//传入了地址
test(&a)
fmt.Printf("%d", a)
}
(7)在Go中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以对函数调用。
(8)函数既然是一种数据类型,因此在Go中,函数可以作为形参,接收函数传入
(9)为了简化数据类型定义,Go支持自定义数据类型,基本语法: type 自定义数据类型名 数据类型 可以理解为 : 相当于起了一个别名 例如:type mylnt int —–》这时mylnt就等价int来使用了,但虽然是别名,但在Go中编译识别的时候,这两者不为一种数据类型,即不能直接相互传值(可以强制类型转换)。
(10)支持对函数返回值命名,即可以给返回值命名,之后会自动返回该值:
代码语言:javascript复制func test() (return1 int, return2 int) {
return1 = 10
return2 = 10
return
}
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=7x94mohwyp5u