Go语言学习笔记一 Golang的安装与基础

2023-02-22 12:04:45 浏览数 (1)

  • , 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

0 人点赞