Go语言基本语法总结 | 青训营

70 阅读3分钟

变量

两种声明方式

var a = "initial"
var b, c int = 1, 2
g := a + "foo"

常量

把var变成const即可,会自动确定类型

const s string = "constant"
const h = 50

循环

只有for循环

for {
}
for i := 0; i < 9; i++ {
}
for i <= 3 {
}

switch

不需要加break,可以使用任意的变量类型,可以取代任意的if else

数组

很少直接用数组,更多用切片

var a [5]int
b := [5]int{1, 2, 3, 4, 5}
var c [2][3]int

切片

可变长度的数组,有类似Python的切片操作

s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
s = append(s, "d")
s = append(s, "e", "f")
c := make([]string, len(s))
copy(c, s)
fmt.Println(s[2:5])    // [c d e]

切片与数组的区别:解密 Go 语言中数组和切片的奥秘:深入剖析它们的区别 - 掘金 (juejin.cn)

range

对于数组或map,可以用range快速遍历

nums := []int{2, 3, 4}
for i, num := range nums {
}
m := map[string]string{"a": "A", "b": "B"}
for key, value := range m {
}

函数

原生支持返回多个值,在实际项目中,几乎都是返回多个值。第一个值是真正的返回值,第二个值是错误信息

func exists(m map[string]string, k string)(v string, ok bool){    //前面是参数,后面是返回值
    v, ok = m[k]
    return v, ok
}

指针

与C语言形式类似

func add2ptr(n *int) {
    *n += 2
}
add2ptr(&n)

结构体

用法类似C

type user struct {
    name string
    password string
}

a := user{name: "wang", password: "1024"}
b := user("wang", "1024"}
c := user{name: "wang"}
c.password = "1024"

结构体方法

类似成员函数

在func关键字后面插入结构体变量就可以创建结构体方法,使用指针可以修改结构体

func (u user) checkPassword(password string) bool {
}
func (u *user) resetPassword(password string) {
}

错误处理

使用单独的返回值来传递错误信息,可以很清晰的知道是哪个函数返回了错误,并且可以用if else来处理错误。可以在函数的返回值里面加入error。

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")
}
u, err := findUser{[]user{{"wang", "1024"}}, "wang"}
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(u.name)

字符串操作

        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))                     //重复多个字符串
	fmt.Println(strings.Replace(a, "e", "E", -1))         //替换
	fmt.Println(strings.Split("a-b-c", "-"))              //切片
	fmt.Println(strings.ToLower(a))
	fmt.Println(strings.ToUpper(a))
	fmt.Println(len(a))
	b := "你好"
	fmt.Println(len(b))

true
2
true
true
2
he-llo
hellohello
hEllo
[a b c]
hello
HELLO
5
6

格式化输出

类似C中的printf,但是可以用%v代表任意变量,%+v可以打印出字段名,%# v可以打印出整个构造的类型名称、字段名称和值

type point struct {
	x, y int
}

func main() {
	s := "hello"
	n := 123
	p := point{1, 2}
	fmt.Println(s, n)
	fmt.Println(p)

	fmt.Printf("s=%v\n", s)
	fmt.Printf("n=%v\n", n)
	fmt.Printf("p=%v\n", p)
	fmt.Printf("p=%+v\n", p)
	fmt.Printf("p=%#v\n", p)

	f := 3.1415
	fmt.Printf("%.2f\n", f)
}

hello 123
{1 2}
s=hello
n=123
p={1 2}
p={x:1 y:2}
p=main.point{x:1, y:2}
3.14