Go 语言入门指南:基础语法和常用特性解析

66 阅读3分钟

一、Go语言的特性

  • 高性能、高并发
  • 性能与 C++ 和 Java 相媲美
  • 丰富的标准库
  • 完善的工具链
  • 静态链接
  • 语法简单
  • 快速编译
  • 跨平台
  • 垃圾回收

二、Go语言的基础语法

变量的声明

var a = "initial"

a := "initial"

var e float 64

常量的声明

  • 常量无确定的数据类型
  • 根据上下文自动确定类型
const h = 500

if else

  • if 后条件语句无括号
  • 条件语句后必须包含大括号
if 7%2 == 0 {
		fmt.Println("7 is even")
	} else {
		fmt.Println("7 is odd")
	}

循环

  • 与 if else 一样条件语句不用加括号
  i := 1
	for {
		fmt.Println("loop")
		break
	}
        
	for j := 7; j < 9; j++ {
		fmt.Println(j)
	}

	for n := 0; n < 5; n++ {
            if n%2 == 0 {
                    continue
            }
            fmt.Println(n)
	}
        
	for i <= 3 {
		fmt.Println(i)
		i = i + 1
	}

switch

  • 默认不需要写 break 每个 case 语句做完就退出
  • 可以在 case 后写条件语句
  • 相较 C++,Go 中 switch 后变量类型更加丰富
t := time.Now()
switch {
case t.Hour() < 12:
        fmt.Println("It's before noon")
default:
        fmt.Println("It's after noon")
}

数组

var a [5]int

a[4] = 100

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

var twoD [2][3]int

切片

// 定义
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"

// 长度增长
s = append(s, "d")

// 复制
copy(c, s)

// 输出
fmt.Println(c) // [a b c d e f]
fmt.Println(s[2:5]) // [c d e] 第二到第五(不包含第五)
fmt.Println(s[:5])  // [a b c d e]
fmt.Println(s[2:])  // [c d e f]

map

  • map 中的顺序是无序的
// 定义
m := make(map[string]int)

// 读取
r, ok := m["unknow"]  // 通过 ok 判断 map 中 key "unknown" 是否存在

// 删除
delete(m, "one")

range 遍历

  • range 遍历时返回 -- 数组:索引 + 对应的值 map :key + value
  • 如不需要返回索引,可用下划线忽略
nums := []int{2, 3, 4}
sum := 0
for i, num := range nums {
        sum += num
        if num == 2 {
                fmt.Println("index:", i, "num:", num) // index: 0 num: 2
        }
}

m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
        fmt.Println(k, v) // b 8; a A
}
for k := range m {
        fmt.Println("key", k) // key a; key b
}

函数

  • 在实际业务中,函数一般返回两个值:结果 + 错误信息
  • 与其它语言不同,Go 语言定义函数类型后置
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) // 3

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

指针

  • 与 C++ 基本相同
func add2ptr(n *int) {
	*n += 2
}

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

	fmt.Println(a, b, c, d)                 // {wang 1024} {wang 1024} {wang 1024} {wang 1024}
	fmt.Println(checkPassword(a, "haha"))   // false
	fmt.Println(checkPassword2(&a, "haha")) // false
}

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

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

结构体方法

// 定义方法:将参数移到函数名前面
func (u user) checkPassword(password string) bool {
	return u.password == password
}

func (u *user) resetPassword(password string) {
	u.password = password
}

错误处理

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")
}

func main() {
	u, err := findUser([]user{{"wang", "1024"}}, "wang")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(u.name) // wang

	if u, err := findUser([]user{{"wang", "1024"}}, "li"); err != nil {
		fmt.Println(err) // not found
		return
	} else {
		fmt.Println(u.name)
	}
}

字符串操作

func main() {
	a := "hello"
	fmt.Println(strings.Contains(a, "ll"))                // 判断字符串中是否包含另一个字符串
	fmt.Println(strings.Count(a, "l"))                    // 计数
	fmt.Println(strings.HasPrefix(a, "he"))               // true
	fmt.Println(strings.HasSuffix(a, "llo"))              // true
	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", "-"))              // [a b c]
	fmt.Println(strings.ToLower(a))                       // hello
	fmt.Println(strings.ToUpper(a))                       // HELLO
	fmt.Println(len(a))                                   // 5
	b := "你好"
	fmt.Println(len(b)) // 6
}

字符串格式

type point struct {
	x, y int
}

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

	fmt.Printf("s=%v\n", s)  // s=hello
	fmt.Printf("n=%v\n", n)  // n=123
	fmt.Printf("p=%v\n", p)  // p={1 2}
	fmt.Printf("p=%+v\n", p) // p={x:1 y:2}
	fmt.Printf("p=%#v\n", p) // p=main.point{x:1, y:2}

	f := 3.141592653
	fmt.Println(f)          // 3.141592653
	fmt.Printf("%.2f\n", f) // 3.14
}