[ GO语言基础语法 | 青训营笔记 ]

41 阅读3分钟

Go语言基础语法

什么是Go:

  1. 高性能, 高并发
  2. 丰富的标准库
  3. 完善的工具链
  4. 静态链接
  5. 快速编译
  6. 跨平台
  7. 垃圾回收

基础组成: 变量是后置的

  1. 包声明
  2. 引入包
  3. 函数
  4. 变量
  5. 语句 & 表达式
  6. 注释
package main

import "fmt"

func main() {
   /* 这是我的第一个简单的程序 */
   fmt.Println("Hello, World!")
}

(字符串可以通过+实现)

语言变量

  • 声明变量的一般形式是使用var关键字, 可一次声明多个

var identifier1, identifier2 type

var b, c int = 1, 2

  • 也可以用 :=

intVal := 1 相当于 var intVal int intVal = 1

语言常量

  • 在程序运行时, 不会被修改的量, 用const

const identifier [type] = value

func main() {
	var a = "initial"

	var b, c int = 1, 2

	var d = true

	var e float64

	f := float64(e)

	g := a + "foo"

	fmt.Println(a, b, c, d, e, f)
	fmt.Println(g)

	const s string = "contant"

	const h = 50000
	const i = 3e20
	fmt.Println(s, h, i, math.Sin(h), math.Sin(i))

}

基础语法

/*if后没有括号, 而且必须加大括号*/
	if 7%2 == 0 {
		fmt.Println("7 is even")
	} else {
		fmt.Println("7 is odd")
	}

/*只有for循环, 什么都不写就是死循环*/
	for {
		fmt.Println("loop")
		break
	}
	for j := 1; j < 3; j++ {
		fmt.Println(j)
	}

	/*switch*/
	a := 2
	switch a {
	case 1:
		fmt.Println("one")
	case 2:
		fmt.Println("two")
	default:
		fmt.Println("other")
	}

数组

var a [5]int
	a[4] = 100
	fmt.Println(a[4], len(a))

	/*切片可以看作是一个可变长的数组*/
	s := make([]string, 3)
	s[0] = "a"
	s[1] = "b"
	s[2] = "c"
	fmt.Println(len(s))

	// 可以用append, 注意要赋值回去
	s = append(s, "d")
	fmt.Println(s)

	// 可以用copy复制
	c := make([]string, len(s))
	copy(c, s)
	fmt.Println(c)

	// 也有substring操作
	fmt.Println(s[1:3])

Map

是完全随机的

// 一个是key的类型, 一个是val的类型
	m := make(map[string]int)
	m["one"] = 1
	m["two"] = 2
	fmt.Println(m) //map[one:1 two:2]

	// 判断key是否存在
	r, ok := m["unknown"]
	fmt.Println(r, ok) //0 false

	// 删除
	delete(m, "one")
	
	m2 := map[string]int{"one" : 1, "two" : 2}

函数

变量类型都是后置的

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

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

// 注意这里返回值也是有两个v和ok
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"}, "a")
	fmt.Println(v, ok)
}

指针

// 这个+2是没用的, 因为传入的参数是copy
func add2(n int) {
	n += 2
}

// 所以要用指针类型
func add2ptr(n *int) {
	*n += 2
}

func main() {
	n := 5
	add2(n)
	fmt.Println(n) // 5
	add2ptr(&n)
	fmt.Println(n) // 7
}

结构体

type user struct {
	name     string
	password string
}

func main() {
	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
}

结构体方法

func main() {
	a := user{name: "wang", password: "1024"}
	a.checkPassword("1024")
}
**// 这里改成了结构体方法
func (u user) checkPassword(password string) bool {
	return u.password == password
}**

错误处理

用单独的返回值反映

// 返回值里面加一个error变量
func findUser(user []user, name string) (v user, err error) {
	for _, u := range users {
		if u.name == name {
			return u, nil
		}
	}
	return nul, errors.New("not found")
}