Go语言基础|青训营笔记

83 阅读4分钟

走进go语言基础语言:

go基本语法:

1.hello :

package main

import "fmt"

func main() {
        
}

2.变量:

var a = "initial" //定义变量时,可用var 或 :=  
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo" //字符串是内置类型,可通过加号拼接
fmt.Println(a, b, c, d, e, f)
fmt.Println(g)

const s string = "constant" //常量用const来定义,
    常量没有确定的类型,一般通过上下文确定类型
const h = 500000000
const i = 3e20 / h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))

3.if-else

与C语言不同的是if后面的条件不加括号,多个条件用;分隔。

4.循环

go 只有for循环,for循环条件没有括号

for没有条件会形成死循环

go中也可使用break和continue

5.switch

   goswitchcase当执行完一个后会直接结束switch
package main

import (
        "fmt"
        "time"
)

func main() {
        a := 2
        switch a {
        case 1:
                fmt.Println("one")
        case 2:
                fmt.Println("two")
        case 3:
                fmt.Println("four or five")
        case 4, 5:
                fmt.Println("fout or five")
        default:
                fmt.Println("other")
        }

t := time.Now()
switch { //不加条件的switch
    可以当作多个if-else条件语句使用
case t.Hour() < 12:
	fmt.Println` 
            ("It's before noon")
default:
	fmt.Println("It's after noon")
}

}

6.数组和切片

  1. 定义一个定长数组: 1.var a [5]int 2.b := [5]int{1, 2, 3, 4, 5}
  2. make 创建一个可变长数组: s := make([]string, 3)
  3. go有与python类似的切片,但不支持负数索引

7.map

**map是无序的**
package main

import "fmt"

func main() {
        m := make(map[string]int) //map语法:变量 :=make(map[key]value) 此处为空map
        m["one"] = 1
        m["two"] = 2
        fmt.Println(m)
        fmt.Println(m["one"])
        fmt.Println(m["know"])

        r, ok := m["know"]
        fmt.Println(r, ok) //ok 可以显示r是否在map中
        delete(m, "one")
        fmt.Println(m)

        m2 := map[string]int{"one": 1, "two": 2} //空值map需要用make()
        var m3 = map[string]int{"one": 1, "two": 2}
        fmt.Println(m2, m3)
}

8.range

range遍历数组会返回索引和值

9.函数和指针

// go函数支持返回多个值,第一个值是返回结果,第二个是错误信息
package main

import "fmt"

func add(a int, b int) int { //括号外的类型是返回值类型
        return a + b
}

func add2(a, b int) int {
        return a + b
}

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

func main() {
        res := add(1, 2)
        fmt.Println(res)

        v, ok := exists(map[string]string{"a": "A", "b": "B"}, "b")
        fmt.Println(v, ok)
}

package main
import "fmt"

func add(n *int) {
        *n += 2
}

func main() {
        n := 5
        add(&n)
        fmt.Println(n)
        add(&n)
        fmt.Println(n)
}

10.结构体

type user struct {
        name     string
        password string
}

func main() {
        a := user{name: "wang", password: "1024"}
        b := user{"li", "2048"}
        c := user{name: "zhang"}
        var d user
        d.name = "wu"
        d.password = "7788"

        fmt.Println(a, b, c, d)
        fmt.Println(checkPassword(a, "1024"))
        fmt.Println(checkPassword2(&a, "gaga"))
}

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

        return u.password == password //使用指针可对结构体修改
}

11.字符串操作和格式化

replace函数的格式:Replace(s, old, new string, n int) string //返回将s中前n个不重叠old子串都替换为new的新字符串,如果n<0会替换所有old子串。

        
	a := "hello"
	fmt.Println(strings.Contains(a, "ll")) //判断一个字符串里面是否包含一个字符串

	fmt.Println(strings.Count(a, "l")) //记录该字符串中有几个后面的字符串

	fmt.Println(strings.HasPrefix(a, "he")) //检测字符串是否以指定的前缀开头。

	fmt.Println(strings.HasSuffix(a, "llo")) //检查字符串是否以指定的后缀开头

	fmt.Println(strings.Index(a, "ll")) //查找字符串的位置

	fmt.Println(strings.Join([]string{"he", "llo"}, "-")) //链接字符串

	fmt.Println(strings.Repeat(a, 2)) //重复字符串n次

	fmt.Println(strings.Replace(a, "e", "E", -1))

	fmt.Println(strings.Split("a-b-c", "-")) //在一个字符串中去除指定字符串

	fmt.Println(strings.ToLower(a)) //hello

	fmt.Println(strings.ToUpper(a)) //HELLO

字符串的格式化:

  • 可用%v打印任何类型的变量
  • %+v打印出字段的名字和值 例如:p={x:1 y:2}
  • %#v打印结构体构造加字段名字和值 p=main.point{x:1,y:2}

12.JSON处理

package main

import (
	"encoding/json"
	"fmt"
)

type userInfo struct { //golang的JSON操作需要结构体字段第一个字母大写
	Name  string
	Age   int `json:"age"` //将Age字段名改成age
	Hobby []string
}

func main() {
	a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
	buf, err := json.Marshal(a) //数列化结构体
	if err != nil {
		panic(err) //当程序发生panic时,程序会执行当前栈中的defer 函数列表。然后打印引发panic的具体信息,最后进程退出
	}
	fmt.Println(buf)               //数组(16进制编码)
	fmt.Println("1:", string(buf)) //强制类型转换才能输出结构体内容

	buf, err = json.MarshalIndent(a, "", "\t") //待查
	if err != nil {
		panic(err)
	}
	fmt.Println("2:", string(buf))

	var b userInfo
	err = json.Unmarshal(buf, &b) //反数列化到一个空的变量
	if err != nil {
		panic(err)
	}
	fmt.Printf("%#v\n", b)
}

初学者便签:

1.同一个目录下面不能有个多 package main。
2.当代码单独存为一个文件夹时在终端run时需要如下:go run+代码存放的文件夹名\代码名.go。
3.当终端出现xxxxx\xxxxx.go:1:1: expected 'package', found 'EOF'时ctrl+s保存即可运行。