青训营 Day1 Go语言基础语法

58 阅读5分钟

一-1 Go 语言基础语法 1-1基础语法 package main import ( "fmt" ) func main(){ fmt.Println("hello world") }

1-2 变量 ^变量类型:int 整数;float浮点型;string 字符串;bool布尔型(ture fasle) *声明变量 :name := (自动判断) var name string="zhangruohan" ; var a,b int = 1,2 ; var c bool=false;var e float64 (没有赋值默认为0) **转化: f:=float32(e) 表示e的值转化为float32赋值给f 拼接 g:=name+"cute" 表示name的值与字符串“cute”拼接“zhangruohancute” *常量定义:const pi int =3.14 *打印 fmt.Println("") 函数 math.Sin()

^变量类型 *数组 a.定义;var arrayName [length]dataType=diyigefuzhi var intArray [30]int = 10(给第一个元素赋值10) b.打印 fmt.Println(intArray) c.初始化:intArray := [5]int{10, 20, 30, 40, 50} d.2x3的二维整数数组twoD 2d: [[0 1 2] [1 2 3]]

*切片slice a.切片包含了指向底层数组的指针、切片的长度和容量信息。由于切片是对数组的引用,因此修改切片中的元素会影响原始数组,反之亦然。切片支持自动扩容. b.创建 创建一个初始长度为5的整数切片 slice := make([]int, 5) /slice := []int{1, 2, 3, 4, 5} []里面代表数组长度 eg:slice[0] = 10 // 修改第一个元素为10 fmt.Println(slice[3]) // 访问第四个元素的值 c.追加元素 slice := []int{1, 2, 3} slice = append(slice, 4) d.切割切片 subSlice := slice[1:4] // 取出第二个到第四个位置的元素,得到[2, 3, 4]

*map a.创建: /创建一个键类型为string,值类型为string的map,并指定初始容量为10 m := make(map[string]string, 10) eg:m:= make(map[string]int,10) m["apple"] =1 fmt.Println(m["apple"]) delete(m,"apple") b.遍历 m := map[string]int{ "apple": 1, "orange": 2, }

// 使用 range 关键字来迭代 Map,从而在每次循环迭代中获取键和对应的值。 for key, value := range m { // 每次迭代会获取 Map 中的一个键值对,此时打印键值对的值 fmt.Println(key, value) }

**range关键字 a.遍历数组和切片 arr := [3]int{1, 2, 3} for index, value := range arr { // index是索引,value是对应索引处的值 fmt.Println(index, value) } 遍历字符串 str := "hello" for index, char := range str { // index是字符在字符串中的字节索引,char是对应字节处的Unicode字符 fmt.Println(index, char, string(char)) } 注意: str := "hello" for _, char := range str { // 使用下划线 _ 忽略索引,char是对应字节处的Unicode字符 fmt.Println(char) }

1-3 语法 *if else : if num := 9; num < 0 { fmt.Println(num, "is negative") } else if num < 10 { fmt.Println(num, "has 1 digit") } else { fmt.Println(num, "has multiple digits") }

*循环 a.C循环 for i := 0; i < 10; i++ { // 循环体 }

b.for { // 这是一个无限循环 // 可以在循环体内使用 break 跳出循环 // 或者使用 continue 来继续下一次循环 } c.类似while for condition { // 循环体 // 当 condition 为 true 时,继续循环 // 当 condition 为 false 时,跳出循环 } d.类似 do while for { // 循环体 // 此处可以放置 do-while 循环的代码逻辑

if condition {
    break
}
// 在此处放置 while 循环的条件表达式,当条件满足时跳出循环,否则继续执行循环体

}

*switch num := 10 switch { case num < 0: fmt.Println("Negative number") case num >= 0 && num < 10: fmt.Println("Single-digit positive number") case num >= 10 && num < 100: fmt.Println("Double-digit positive number") default: fmt.Println("Large positive number") }

1-4 函数 *func functionNme(paremeter) (returnType1,returnType2,.){ //函数体 return vaule1,vaule2,... }

*add func add(a int, b int) int { return a + b } 输入部分可简化 func add2(a, b int) int { return a + b }

*exists func exists (m map[sttring]string,k string)(v string,ok bool){ v,ok=m[k] return v,ok }

*divide func divide(a, b int) (int, error) { if b == 0 { return 0, errors.New("division by zero") } return a / b, nil } 这个函数divide接受两个int类型的参数a和b,返回两个值:第一个值为a/b的结果,第二个值是一个error类型,用于表示可能出现的错误情况。

1-5 指针 指针会改变原始变量 eg: func add1(n,int)(int){ n+=2 return n }

func addptr (n,int){ n+=2 } 这个函数接受一个int类型的指针n,参数类型为int。在函数内部,通过n来获取指针指向的值,然后进行修改。因为参数是指针,函数对其进行的修改会影响原始的变量。 在main函数中,我们通过add2ptr(&n)将n的地址传递给函数add2ptr,所以函数会直接修改原始的变量。因此,n的值会变为7。

1-6 结构体 *type user struct { name string password string } a := user{name: "wang", password: "1024"}

b := user{"wang", "1024"}

c := user{name: "wang"} c.password = "1024"

var d user d.name = "wang" d.password = "1024"

**作为函数参数 func checkPassword(u user, password string) bool { return u.password == password }

func checkPassword2(u *user, password string) bool { return u.password == password } (指针)

eg:findUser函数 import ( "errors" "fmt" )

type user struct { name string password string }

func findUser(users []user, name string) (v *user, err error) { for _, u := range users { if u.name == name { return &u, nil } } return nil, errors.New("not found") }

1-6字符串操作 func Contains(s, substr string) bool: 功能:判断字符串s中是否包含子字符串substr。 返回值:如果包含,则返回true,否则返回false。

func Count(s, substr string) int: 功能:统计字符串s中子字符串substr的出现次数。 返回值:返回子字符串出现的次数。

func HasPrefix(s, prefix string) bool: 功能:判断字符串s是否以子字符串prefix开头。 返回值:如果以prefix开头,则返回true,否则返回false。

func HasSuffix(s, suffix string) bool: 功能:判断字符串s是否以子字符串suffix结尾。 返回值:如果以suffix结尾,则返回true,否则返回false。

func Index(s, substr string) int: 功能:查找字符串s中子字符串substr的第一个出现位置。 返回值:如果找到,则返回子字符串的索引值;如果未找到,则返回-1。

func Join(elems []string, sep string) string: 功能:将字符串切片elems使用sep连接成一个字符串。 返回值:返回连接后的字符串。

func Repeat(s string, count int) string: 功能:将字符串s重复count次。 返回值:返回重复后的字符串。

func Replace(s, old, new string, n int) string: 功能:将字符串s中前n个子字符串old替换为new。 返回值:返回替换后的字符串。 注意:如果n大于0:表示最多替换n个匹配的子字符串。如果n小于0:表示替换所有匹配的子字符串。如果n等于0:表示不替换任何匹配的子字符串。

func Split(s, sep string) []string: 功能:将字符串s按照分隔符sep进行切割,返回切割后的字符串切片。 返回值:返回切割后的字符串切片。

func ToLower(s string) string: 功能:将字符串s中的所有字符转换为小写形式。 返回值:返回转换后的字符串。

func ToUpper(s string) string: 功能:将字符串s中的所有字符转换为大写形式。 返回值:返回转换后的字符串。

*字符串格式化 %v %+v %#v eg:打印出s=zhangruohan s:="zhangruohan" fmt.Println("s=%+v\n",s)

1-7 import *math *"encoding/json" *time 时间处理 time.Now() time.Date() t := time.Date(2023,8,2,16,34,2,0.time.Utc) fmt.Println(t.Year(),t.Month.(), diff:=t2.Sub(t1) if err != nil { panic(err)

}