Go语言入门指南 · 一些基础语法 | 豆包MarsCode AI刷题

82 阅读4分钟
  1. Go优点
    1. 高性能,标准库完整丰富且兼容性强,不需过多依赖第三方库。
    2. 语法简单易上手。
    3. 所有的编译结构默认使用静态链接,只需要考虑编译之后唯一一个可执行文件,方便快捷。编译速度快。
  2. 配置Go语言开发环境(个人选择命令行运行
    1. 官网下载Golang
    2. 需要更改本机默认的GoPROXY配置,win+r,打开cmd并输入go env可见本机go环境变量配置,其中GoPROXY配置默认是="proxy.golang.org,direct",网络原因应该(依旧使用cmd)更改为"goproxy.io"或"goproxy.cn”。
    3. 如何运行:命令行进入go文件所在文件夹,命令行输入go run helloworld.go即可。
  3. 代码入门
package main // 程序的入口文件 
import ( "fmt" // 导入fmt包 ) 
func main(){ fmt.Println("Hello World!") }
  1. 每个Go应用程序都包含一个名为main的包。
  2. fmt包:fmt 是Go语言中的标准库。主要是用来控制Go语言中终端输入输出,以及格式化输出。且fmt.Println("...")会在最后自动换行。
  3. main函数是每一个可执行程序所必须包含的。
  4. 标识符声明:
    1. 注:以大写字母开头的标识符可以被外部包的代码所使用(需先导入包),以小写字母开头则对包外不可见,但是在整个包的内部是可见可用的。
    2. 再注:同一类型的多个变量可以声明在同一行,多变量可以在同一行进行赋值。如(a,b,c皆已声明)a,b,c = 1,2,"ewr"。以及也可以多个变量同时声明并初始化(a,b,c = 1,2,3)
    3. var a = "abc"
    4. var b int
    5. c := "rftg"(初始化声明,只能用于函数体中,而不可以用于全局变量的声明与赋值。)
  5. 声明一个变量并初始化:
    1. var a = "123"
    2. 等效于: var a string(没有初始化则默认值) a = "123"
    3. 等效于: a := "123"(自动判断类型)(声明并初始化)
  6. 交换变量可以使用a,b = b,a,两个变量类型必须相同。
  7. 空白标识符_ 用于抛弃值。
  8. 注释:
    1. 单行注释//
    2. 多行注释/**/
  9. if的条件不用加括号且其包含语句无论几句都必须加大括号。
  10. for的条件不用加括号。
  11. switch的传入参数也不需要括号,以及case无需添加break。
  12. 数组:(数组长度不可变)
  13. 语言数组声明需要指定元素类型及元素个数,如var arr [10]int。
    1. 声明数组时,每个一元素会默认初始化,如0。
    2. 初始化列表:var nums = [5]int{1,2,3,4,5}
    3. 或这样声明并初始化:nums := [5]int{1,2,3,4,5}
    4. 数组长度不确定可以用 ... 替代数字。
  14. 切片(Slice):(似乎更常用)(切片声明不需要长度)
    1. var s []int = make([]int,3) (3是切片的初始长度)
    2. 可以简写为:s := make([]int,3)
    3. 切片初始化:s := []int {1,2,3}
    4. 切片初始化也可以从数组切:s := arr[:](此部分语法像py)(数字参数是索引)
    5. len()是切片的有效元素个数,cap()(capacity)是切片最长可以到达的长度。
    6. 空切片:== nil
    7. 基础操作函数:
      1. append():
import "fmt" 
func main(){ 
    var nums []int nums = append(nums,0) // 追加空切片 
    nums = append(nums,1) // 追加一个元素1 
    nums = append(nums,2,3,4,5) // 追加多个元素 
    nums2 = make([]int,len(nums),cap(nums)*2) // 创建nums两倍容量的切片(但内容仍为空) 
    copy(nums2,nums) // 对nums2拷贝nums的内容 
    }
  1. Go语言中的Map是无序键值对集合,可迭代,但顺序不确定(随机)。

    1. 获取Map值时,若键不存在不报错而是返回该类型的默认初始值。
    2. Map是引用类型,直接赋值或者传递给函数当参数都是引用,会直接修改到原本的值。
  2. range:用于for循环中迭代数组(array),切片(slice),集合(map)的元素。

    1. 在数组和切片中返回元素的索引和索引对应的值;(注意,值是第二个返回参数而不是第一个)
    2. 在字符串则返回每个字符的索引和unicode值;
    3. 在集合中返回key-value对。
// e.g. for _,v := range m{ fmt.Printf("....") } 
// e.g. for i,c := range "hello"{ fmt.Printf("index: %d,char: %c\n",i,c) }
  1. 函数:
func f1(a int,b int) int{ 
    // 注意声明传入参数类型使用a int而不是int a 
    // ...
} 
// 返回值可以是多个: func f2(a,b string) (string,string){ return y,x }
  1. 指针:(大体类似c++)

  2. 空指针:nil指针( == nil)

  3. 结构体:

// 声明 
type Books struct { 
    title string 
    author string 
    subject string 
    book_id int 
} 
// 创建/实例 
var Book1 Book var Book2 Book{title:"!23",author: "dsfdf"} 
Book3 := Book{"1233","sdf","chinese",100}
  1. 错误处理(在函数返回值加上一个err变量返回值)(error类型是一个接口类型)
// 函数通常在最后的返回值中返回错误信息 
func f1(a,b int) (int,err){ 
    // if ...{ 
    // return ... 
    // } 
    return a,errors.New("not found") 
}