[后端go基础|青训营笔记]

103 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

1.编译和运行

1.1 HelloWorld

package main

import (
	"fmt"
)

func main() {
	fmt.Println("hello world")
}

fmt包用于screen上输出输入字符串,格式化字符串。

1.2 编译方式

1.直接运行go run helloworld.go
2.编译运行go build helloworld.go,然后运行./helloworld

2. 基础语法

2.1 变量声明

func main() {
	//方法一:指定变量类型
	var i int
	
	//方法二:根据值自行判定变量类型
	var num = 100

	//方法三:省略var,=是赋值, :=是声明变量并赋值。注意 :=左侧变量不应该是已经声明过的,否则会编译错误
	name := "helloworld"
	
}

const没有确定的类型,根据上下文自动确定类型。

2.2 if else, for, switch

if 7%2 == 0 {

}
else {

}
for i := 0; i < 5; i++{

}
switch a {
    case 1:
    case 2:
    default:
}

与其他语言区别:

  1. if语句判断条件没有( ),无法像c++那样写成一行(后面必须加{ });
  2. 循环语句只有for;
  3. switch语句不需要break, 如果满足多个条件,中间用逗号分隔,有其中一个匹配成功即可。case可以是条件表达式。

2.3 数组和切片

var a [5]int
b := [5]int{1,2,3,4,5}
数组长度固定,与其他语言没有差别。
s := make([]string, 3)
切片类似于动态数组。可以使用s = append(s, "d")追加元素, 注意结果需赋值原数组。s[2:5]取元素类似于python, 但不支持负索引。

2.4 map & range

m := make(map[string]int)
m['one'] = 1
这里key is string, value is int
for i, num range nums{ }
range可以用来遍历数组, 返回两个值, 索引和对应的值。不需要索引可以用下划线_忽略。

2.5 func

func add(a int, b int) int{ }
变量类型后置很烦。

2.6 指针

func add2ptr(n *int){ *n += 2 }
类似c和c++,主要用途是对传入参数进行修改,其实就是需要用指针对变量进行操作,而直接使用则操作的是局部变量。

2.7 结构体

type user struct{
    name string
    password string
}

初始化:
a := user{name: "wang", password: "1023"}\

结构体方法:

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

or(u *user), 区别是是否对对结构体对象本身修改。

2.7 错误处理

go可以在函数出错的情况下,返回错误信息。通常, 正常输出返回值有两个, 一个是返回值, 另一个是error。如果出错了,可以return nil 和 error信息。

2.8 字符串处理

判断一个字符串是否包含有另一个字符串

        fmt.Println(strings.Contains(hello, "ll"))                // true
	fmt.Println(strings.Count(hello, "l"))                    // 2
	fmt.Println(strings.HasPrefix(hello, "he"))               // true
	fmt.Println(strings.HasSuffix(hello, "llo"))              // true
	fmt.Println(strings.Index(hello, "ll"))                   // 2
	fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo
	fmt.Println(strings.Repeat(hello, 2))                     //hellohello
	fmt.Println(strings.Replace(hello, "e", "E", -1))         // hEllo
	fmt.Println(strings.Split("a-b-c", "-"))              // [a b c]
	fmt.Println(strings.ToLower(hello))                       // hello
	fmt.Println(strings.ToUpper(hello))                       // HELLO
	fmt.Println(len(hello))                                   // 5

strings.Contains 字符串s中是否包含substr返回bool值;
strings.Join 字符串链接;
strings.Index 在字符串s中查找sep所在的位置,返回位置值,找不到返回-1;
strings.Repeat 在s字符串中,把old字符串替换为new字符串,n表示替换的次数,小于0表示全部替换;
strings.Split 把s字符串按照sep分割,返回slice

2.9 字符串格式化

使用%v打印任意类型变量, %+v打印详细结果, %#v更详细

2.10 JSON处理

type userInfo struct {
	Name  string
	Age   int `json:"age"`
	Hobby []string
}

结构体转JSON串:
buf, err := json.Marshal(a) a是结构体实例化对象
JSON串反序列化到结构体变量:
err = json.Unmarshal(buf, &b)

2.11 数字字符串转换

包 strconv(string convert)
字符串转数字:
f, _ = strconv.ParseFloat("1.234", 64)
数字转字符串:
e, err := strconv.Atoi("1023")

3. 命令行获取

os.Argv 获取命令行参数
os.Getenv("PATH") 获取环境变量
os.Setenv("AA", "BB") 设定环境变量