第一个Go程序
package main
import "fmt"
func main() {
	fmt.Println("hello world")
}
运行方式1:
go run main.go
运行方式2:
go build
.\hello_go.exe

运行方式3:goland右键运行
 
字符串拼接
使用加号可以对字符串进行拼接。
package main
import "fmt"
func main() {
	fmt.Println("hello world" + "你好世界")
}
变量的声明和初始化
package main
import "fmt"
func main() {
	var a, b, c int
	a = 11
	b = 22
	c = 333
	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(c)
}
简短的声明
上面的变量定义和初始化有更简单的方式,如下:
package main
import "fmt"
func main() {
	a := 11
	b := 22
	c := 333
	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(c)
}
格式化输出
使用%d可以在字符串中格式化输入整数类型,如下:
package main
import "fmt"
func main() {
	a := 11
	b := 22
	c := 333
	fmt.Printf("a=%d, b=%d, c=%d\n", a, b, c)
}
if语句
if语句主要有三种格式,如下:
package main
import "fmt"
func main() {
	a := 33
	// 单分支
	if a > 0 {
		fmt.Println(a)
	}
	// 双分支
	if a < 0 {
		fmt.Println(a)
	} else {
		fmt.Println(a + a)
	}
	// 多分支
	if a > 100 {
		fmt.Println(a)
	} else if a > 0 {
		fmt.Println(a + a)
	} else {
		fmt.Println(a + a + a)
	}
}
for循环
累加求和:
package main
import "fmt"
func main() {
	sum := 0
	for i := 0; i < 101; i++ {
		sum += i
	}
	fmt.Println(sum)
}
双重for循环打印九九乘法表
package main
import "fmt"
func main() {
	for i := 1; i < 10; i++ {
		for j := 1; j <= i; j++ {
			fmt.Printf("%d * %d = %d\t", j, i, i*j)
		}
		fmt.Println()
	}
}
for遍历数组
package main
import "fmt"
func main() {
	arr := []int{11, 22, 33}
	for k, v := range arr {
		fmt.Println(k, v)
	}
}
for 遍历字符串
package main
import "fmt"
func main() {
	arr := "abc"
	for k, v := range arr {
		fmt.Println(k, v)
	}
}
for遍历字典
package main
import "fmt"
func main() {
	arr := map[string]int{"one": 1, "two": 2, "three": 3}
	for k, v := range arr {
		fmt.Println(k, v)
	}
}
for 遍历管道
package main
import "fmt"
func main() {
	c := make(chan int)
	go func() {
		c <- 33
		c <- 333
		c <- 333333
		close(c)
	}()
	for v := range c {
		fmt.Println(v)
	}
}
匿名变量
如果我们在遍历的时候,不想要key或者value,也可以用下划线替代,下划线叫做匿名变量。
package main
import "fmt"
func main() {
	c := []int{1, 2, 3}
	for _, v := range c {
		fmt.Println(v)
	}
}
switch 语句
go语言里面的switch语句每个case天生就是独立的,不需要加break。
package main
func main() {
	s := "python"
	switch s {
	case "python":
		print("1")
	case "go":
		print("2")
	case "java":
		print("3")
	default:
		print("4")
	}
}
switch 可以一个分支捕获多个值
这个是go语言的特点,很少在其他语言看见,我们来看例子:
package main
func main() {
	s := "python"
	switch s {
	case "python", "go", "java":
		print("1")
	default:
		print("4")
	}
}
switch的分支可以捕获条件判断
这个也是go语言的特点,我们来看例子:
package main
func main() {
	s := 33
	switch {
	case s > 0 || s < 100:
		print("1")
	default:
		print("4")
	}
}
字符串可以通过索引访问字符
package main
func main() {
	s := "abcde"
	print(s[0])
}
字符串可以通过切片访问连续字符
package main
func main() {
	s := "abcde"
	print(s[0:3])
}
统计字符串的个数要用特殊的方法
package main
import "unicode/utf8"
func main() {
	s := "abcde"
	print(utf8.RuneCountInString(s))
}
将字符编码转换为字符
package main
func main() {
	s := "abcde"
	print(string(s[1]))
}
遍历字符串的每一个字符
package main
import "fmt"
func main() {
	s := "我 爱 你 中 国"
	cs := []rune(s)
	for _, ch := range cs {
		fmt.Println(string(ch))
	}
}
使用buffer累加字符串
package main
import (
	"bytes"
	"fmt"
)
func main() {
	var bf bytes.Buffer
	for i := 0; i < 10; i++ {
		fmt.Fprintf(&bf, "a%d ", i)
	}
	s := bf.String()
	fmt.Println(s)
}
通过指针修改变量的值
指针可以直接对内存地址进行操作。使用*表示指针,使用&取地址。
package main
import "fmt"
func main() {
	a := 33
	pa := &a
	*pa = 333
	fmt.Println(a)
	fmt.Println(*pa)
}
使用指针交换两个变量的值
package main
import "fmt"
func swap(a, b *int) {
	*a, *b = *b, *a
}
func main() {
	a, b := 33, 11
	fmt.Println(a, b)
	swap(&a, &b)
	fmt.Println(a, b)
}
数组的基本使用
package main
import "fmt"
func main() {
	// 声明
	var arr [8]int
	// 赋值
	for i := 0; i < 8; i++ {
		arr[i] = i * 33
	}
	// 遍历
	for i := 0; i < 8; i++ {
		fmt.Println(arr[i])
	}
}
结构体的基本用法
package main
import "fmt"
type User struct {
	Name string
	Age  int
}
func main() {
	zs := User{"zs", 20}
	ls := User{Name: "ls", Age: 20}
	fmt.Println(zs, ls)
}
结构体作为函数参数
package main
import "fmt"
type User struct {
	Name string
	Age  int
}
func printUser(u User) {
	fmt.Printf("姓名:%s 年龄:%d \n", u.Name, u.Age)
}
func main() {
	zs := User{"zs", 20}
	ls := User{Name: "ls", Age: 20}
	printUser(zs)
	printUser(ls)
}
结构体指针作为函数参数
package main
import "fmt"
type User struct {
	Name string
	Age  int
}
func printUser(u *User) {
	fmt.Printf("姓名:%s 年龄:%d \n", u.Name, u.Age)
}
func main() {
	zs := User{"zs", 20}
	ls := User{Name: "ls", Age: 20}
	printUser(&zs)
	printUser(&ls)
}
切片的增删改查
切片在go语言里面非常常用,因为其有动态扩展的特性。
package main
import "fmt"
func main() {
	var arr []int
	// 增加
	arr = append(arr, 11)
	arr = append(arr, 22)
	arr = append(arr, 33)
	// 删除 索引1
	index := 1
	arr = append(arr[:index], arr[index+1:]...)
	// 修改
	arr[0] = 888
	// 遍历
	for _, v := range arr {
		fmt.Println(v)
	}
}
map的增删改查
package main
import "fmt"
func main() {
	var m = make(map[string]int)
	// 增加
	m["a"] = 11
	m["b"] = 12
	m["c"] = 13
	// 删除
	delete(m, "a")
	// 修改
	m["c"] = 888
	// 遍历
	for k, v := range m {
		fmt.Println(k, v)
	}
}
加法函数
package main
import "fmt"
func add(a, b int) int {
	return a + b
}
func main() {
	fmt.Println(add(1, 2))
}
函数的可变参数
package main
import "fmt"
func add(arr ...int) int {
	sum := 0
	for i := 0; i < len(arr); i++ {
		sum += arr[i]
	}
	return sum
}
func main() {
	fmt.Println(add(1, 2))
	fmt.Println(add(1, 2, 3, 4, 5))
}
匿名函数
package main
import "fmt"
func main() {
	defer func() {
		fmt.Println("这个是匿名函数")
	}()
	fmt.Println("xxx")
}



















