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