go语言基础 | 青训营笔记

183 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

本篇文章重点只介绍个人觉得go语言和以前所学语言不同之处,以便以后复习所用。

一、什么是go语言:

1.高性能、高并发(不需要在导入第三方库来优化性能)

2.语法简单,学习曲线平缓

3.丰富的标准库

4.完善的工具链

5.静态链接

6.快速编译

7.跨平台

8.垃圾回收

二、环境下载

新手小白推荐直接使用goland。

(jetbrain2022最新破解补丁2022.11.7.zip - 123云盘 (123pan.com))

找到的一个破解版(嘿嘿嘿)

三、基础语法

Go语言的基础语法与常规的编程语言基本类似,所不同的有声明变量的方式,数组、切片、字典的概念及功能与Java不太相同。在我看来有点像python+java+c++的合体版。

3.1 变量、常量、nil

3.1.1 变量声明

Go语言中共有两种方式

1.使用var关键字声明,注意:Go语言的声明变量类型位于变量名称的后面。Go语句结束不需要分号。(和python相同)

如:

var a int

2.使用:=赋值。

a := 3 等同于 var a int = 3

变量的类型会根据右侧的值进行匹配,例如"3"会匹配为int,"result"会匹配为string等。

3.1.2 常量声明

使用const来声明常量,常量在声明后不可改变。

const language string = "go"

3.1.3 nil与零值

只声明未赋值的变量,其值为nil。

零值:

数值类型为 0, 布尔类型为 false, 字符串为 ""(空字符串)。

3.2 判断语句

1.if后不需要加括号(和python类似)

2.注意go语言的if..else语句中else必须紧跟if的最后一个括号

错误写法

if{
}
else{
}

正确写法

if{
}else{
}

3.3 循环语句

go语言只有一个for循环语句,没有do...while..等

3.4 switch语句

go语言的switch语句最后一个default时,不需要加break。

3.5 数组

和python相同,不赘述

3.6 map

Go语言中的map是一种内置数据结构,用于存储键值对(和python的字典相似)。map可用于统计字符串中单词出现次数或维护用户信息数据库等任务。可以使用make函数创建新的map

package main

import "fmt"

func main() {
   m := make(map[string]int)//创造一个空的map
   m["one"] = 1
   m["two"] = 2
   fmt.Println(m)           // map[one:1 two:2]
   fmt.Println(len(m))      // 2
   fmt.Println(m["one"])    // 1
   fmt.Println(m["unknow"]) // 0

   r, ok := m["unknow"]//通过索引查找
   fmt.Println(r, ok) // 0 false

   delete(m, "one")//删除函数

   m2 := map[string]int{"one": 1, "two": 2}
   var m3 = map[string]int{"one": 1, "two": 2}
   fmt.Println(m2, m3)
}
复制代码

3.7 指针

对于学过C语言的同学来说,指针是非常熟悉的,就是一个在内存中实际的16进制的地址值,引用变量的值通过此地址去内存中取出对应的真实值。

说到这顺便分享一下我在学习java时遇到的,值传递和引用传递的区别。 (JAVA:值传递和引用传递_SummerOfFoam的博客-CSDN博客_值传递和引用传递) 注:不是我写的。看到了给大家分享一下。

func main() {
    i := 0
    //使用&来传入地址
    fmt.Println(&i) //0xc00000c054
    
    var a, b int = 3 ,4
    //传入 0xc00000a089 0xc00000a090
    fmt.Println(add(&a, &b)) 
}

//使用*来声明一个指针类型的参数与使用指针
func add(a *int, b *int)int{
    //接收到 0xc00000a089 0xc00000a090
    //前往 0xc00000a089位置查找具体数据 并取赋给x
    x := *a
    //前往 0xc00000a090位置查找具体数据 并取赋给y
    y := *b
	return x+y
}

3.8 错误处理

Go 语言中,错误处理是一个非常重要的部分。Go 提供了一种简单的方法来处理错误,即将错误作为函数的返回值。

在 Go 中,错误发生时,函数返回一个 error 值

func divide(a, b int) (int, error) {
 if b == 0 {
     return 0, fmt.Errorf("division by zero")
 }
 return a / b, nil
}

上例是一个非常常见的除0的例子,在这个例子中,divide 函数接受两个 int 参数,并且返回一个 int 和一个 error。如果 b 等于 0,那么 divide 函数会返回一个 error。如果 b 不等于 0,那么 divide 函数会返回 a / b 和 nil。

3.9 输出格式

go语言不像c语言,不同类型的输出需要不同种的符号,如整数用%d 等等、 go语言中直接用%v即可,除此之外%+v 和 %#v是 fmt包中使用的两个格式化动词。

%+v 会输出详细的值信息,包括结构体字段名称和值。 %#v 会输出详细的值信息,包括类型和值, 这个值得输出格式是一个可以直接复制粘贴到程序中使用的 Go 代码。


import "fmt"

type point struct {
	x, y int
}

func main() {
	s := "hello"
	n := 123
	p := point{1, 2}
	fmt.Println(s, n) //hello 123
	fmt.Println(p)    //{1 2}

    //%v可以打印任何变量,数字用:%d,字符串用:%s,获取更加详细的结果:%+v,在详细上进一步详细:%#v
	fmt.Printf("s=%v\n", s)  //s=hello
	fmt.Printf("s=%v\n", n)  //s=123
	fmt.Printf("s=%v\n", p)  //s={1 2}
	fmt.Printf("s=%+v\n", p) //s={x:1 y:2}
	fmt.Printf("s=%#v\n", p) //s=main.point{x:1, y:2}

	f := 3.141592653
	fmt.Println(f)          //3.141592653 
	fmt.Printf("%.2f\n", f) //3.14
}