Go语言基础语法学习笔记
1. 导包
import "fmt"
import (
"fmt"
"math"
)
2. 变量
-
声明变量
-
var 变量名(会自动识别输入值的类型)
-
var a = "inital" var b, c int = 1, 2 var e float64 -
f := 123
-
-
const 常量名(通过上下文自动确定类型)
-
const a = "asdasdsa" const b string = "asdasd"
-
-
3. 函数的声明
func 函数名([参数列表]) [返回值类型列表] {
函数体
}
4. 基础语法
-
if else(类似于Python?代码块表示由:缩进变为{})
-
if 判断条件 { 判断结果(true),代码块 } else { 判断结果(false),代码块 } -
if [赋值语句;]判断条件 { // 通过该赋值语句创建的变量,作用域在该if语句之中属于局部变量 判断结果(true),代码块 } else if 判断条件 { 判断结果(true),代码块 } else { 判断结果(false),代码块 }
-
-
for
-
死循环
-
for { 循环体 }
-
-
普通的for循环
-
for i:=0; i < 10; i++ { 循环体 }
-
-
仿while(伪)
-
i := 0 for i < 10 { 循环体 i++ }
-
-
仿do...while(伪)
-
i := 0 for { 循环体 if i > 10 { break } }
-
-
-
switch
-
switch 变量 { // 变量类型任意 case 变量结果1: 语句块 case 变量结果2: 语句块 default: 语句块 } -
取代if写法
-
i := 10 switch { case i > 10: 语句块 default: 语句块 }
-
-
-
数组
-
声明方式
-
var a [5]int b := [5]int{1, 2, 3, 4, 5}
-
-
-
切片(可变长度的数组)
-
语法
-
s := make([]string, 3) // 初始值为:“\u0000”?看到都是空 -
a := make([]int, 5) // 初始值为:0 a := make([]float32, 5) // 初始值也为:0?和java有些不一样,使用fmt.Printf("%v ", a[i])进行打印验证 a := make([]float64, 5) // 初始值为:0
-
-
扩容
-
-
通过上图可以得出
- append是是追加,向数组的末尾进行添加数据,同时进行对应长度扩容
-
-
发现一个有点意思的用法
-
-
切片操作
-
//类似Python s := []string{"a", "b", "c", "d", "e", "f"} fmt.Print(s[2:5]) // 前闭后开{)
-
-
-
map
-
语法
-
m := make(map[string]int) // 类似Python中的字典 m = {key[string]:value[int]} // 访问和赋值方式也差不多 // 使用make?应该也是动态的吧,但是和数组有些不同,后面没有表示长度的数字?默认值是零吗? m["one"] = 1 m["two"] = 2 - 猜想错误,应该是map的特性
-
m := map[string]int{"one": 1, "two": 2} - map确实是自带扩容
- 这种写法也是可以的
-
-
-
range
-
语法
-
// 结合for进行使用 // 实现类似java中的增强for,Python中 for in的效果 nums := []int{2, 3, 4} for i, num := range nums{ // 第一个参数为下标,第二个参数为对应下标的数据 循环体 } -
m := map[string]int{"one": 1, "two": 2} for k, v := range m { // 第一个参数为:key,第二个参数为:value 循环体 }
-
-
-
指针
- 指针的主要作用是用来操作数据,如果你想对数据进行增删改需要使用指针,如何只是为了使用则不需要使用指针。
- 指针是直接使用对应的数据,普通传参会进行一个拷贝会消耗内存和时间。
-
结构体
-
语法
-
type 结构体名 struct { 变量名 变量类型 }
-
-
-
结构体方法
-
语法
-
func (形参 绑定结构体名) 结构体方法名([参数列表]) [返回值类型列表] { 方法体 }
-
-
面向对象的感觉,结构体是对象的类属性,结构体是类方法
-
-
错误处理
-
import ( "errors" "fmt" ) errors.New(message) //创建一个报错信息
-
-
字符串操作
-
import ( "strings" ) -
strings.Contains(a, "ll") //在字符串中查找是否存在"ll"字符串, 返回值bool strings.Count(a, "l") //统计字符串"l"在a中出现的次数,返回值int strings.Index(a, "ll") //查找某个字符串出现的位置,返回值int strings.Split("a,v,b,f,h", ",") //分割字符串,返回值[]string strings.ToLower(a) //字符串全小写,返回值string strings.ToUpper(a) //字符串全大写,返回值string len(a) //得到长度,返回值int
-
-
JSON处理
-
import ( "fmt" "encoding/json" ) type userInfo struct { Name string Age string `json:"age"` Hobby map[string]int } func main() { a := userInfo{Name: "小陈", Age: 18, Hobby: map[string]int{"Golang": 90, "Java": 95}} buf, _ := json.Marshal(a) fmt.Println(a) fmt.Println(buf) fmt.Println(string(buf)) } - 真方便
-
-
时间处理
-
import ( "fmt" "time" ) func main() { now := time.Now() //获取当前时间信息 fmt.Println(now.Format("2001-02-15 15:15:05")) fmt.Println(now) } - 可见格式化时间信息并不会对原数据产生影响,并且可以得出Format()返回值为string类型
-
func main() { t := time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC) t2 := time.Date(2022, 3, 27, 2, 30, 36, 0, time.UTC) fmt.Println(t) fmt.Println(t2) diff := t2.Sub(t) // t2 - t fmt.Println(diff) diff2 := t.Sub(t2) // t - t2 fmt.Println(diff2) } - 可以放心减,超时了就是负数
-
-
数字解析
-
import ( "strconv" ) n, err := strconv.Atoi("123") //字符串数字转换成数字,返回值数字类型,errors
-