定义变量

  1. // 定义变量, 后面的类型可写可不写
  2. var name
  3. var nameWithType string
  4. // 不适用var 的方式定义. 此时的name 不能再之前定义过. 否则会报错
  5. name := "Nirvana"
  6. // 数组的定义
  7. var ages = [3]int{1,2,3}
  8. var emails = [...]{"", "", ""}
  9. var names [5]string
  10. names[0] = "a"
  11. names[1] = "b"

变量的地址
  1. var age = 20
  2. fmt.Println("内存地址: ", &age)

常量的使用

  1. // 常量的定义
  2. const age = 10
  3. const name string = "Nirvana"

指针的使用

  1. var a = 10
  2. var ptr *int = &a
  3. // 这边修改的是具体的值, 即a 和 *ptr 都会被修改
  4. *ptr = 11
  5. fmt.Println(*ptr)

结构体的使用

  1. type Books struct {
  2. title string
  3. author string
  4. subject string
  5. bookId int
  6. }
  7. func main() {
  8. // 构造方法1
  9. var book = Books{"三国", "罗贯中", "文科", 10}
  10. fmt.Println(book)
  11. // 构造方法2
  12. var b2 = Books{title: "西游", author: "吴承恩"}
  13. fmt.Println(b2)
  14. // 如果不添加构造函数的参数, 直接填充需要赋值的值。会提示错误
  15. // ./hello.go:19:27: too few values in Books literal
  16. // 访问结构体成员
  17. fmt.Println(b2.title)
  18. }

切片

切片的功能是针对数组的确定而产生的。数组固定的长度, go语言定义切片是动态的数组。

  1. import "fmt"
  2. func main() {
  3. var list = make([]int, 2)
  4. list[0] = 1
  5. list[1] = 2
  6. // 给2 赋值会提示超出指定的索引
  7. // list[2] = 3
  8. // 这里不需要添加var. 因为 := 赋值的方式就是定义变量并初始化
  9. listInit :=[] int {1,2,3}
  10. listFormArray := listInit[:]
  11. // 这边修改了listInit。 导致listFormArray 跟着一起变动.
  12. listInit[2] = 10
  13. // 追加元素
  14. listFormArray = append(listFormArray, 11)
  15. fmt.Println(list)
  16. fmt.Println(listInit)
  17. fmt.Println(listFormArray)
  18. fmt.Println(len(listInit), cap(listInit))
  19. // fmt.Println("Hello Go")
  20. }

Range 的使用

类似遍历数组、切片、集合等等的情况

  1. import "fmt"
  2. func main() {
  3. nums := []int {1,2,3,4,5}
  4. sum := 0
  5. for i, num := range nums {
  6. sum += num
  7. fmt.Println("i = ", i)
  8. }
  9. if sum == 15 {
  10. fmt.Println("哈哈哈哈")
  11. }
  12. fmt.Println(sum)
  13. }

Map 集合的使用

是一种无序的键值对

  1. import "fmt"
  2. func main() {
  3. scores := map[string]int{"语文": 12, "数学": 13}
  4. fmt.Println(scores["语文"])
  5. fmt.Println(scores)
  6. // 遍历
  7. for key, val := range scores {
  8. fmt.Println("key: ", key, " value: ", val)
  9. }
  10. // 手动创建
  11. names := make(map[string]string)
  12. names["name"] = "Nirvana"
  13. names["age"] = "12"
  14. fmt.Println(names)
  15. // 删除元素
  16. delete(names, "age")
  17. }

并发编程

轻量级线程, 通过go 来开启goroutine。

  1. import (
  2. "fmt"
  3. "time"
  4. )
  5. func say(s string) {
  6. for i :=0; i < 5; i++ {
  7. time.Sleep(100*time.Millisecond)
  8. fmt.Println(s)
  9. }
  10. }
  11. func main() {
  12. go say("thread-1")
  13. say("thread-2")
  14. }

通道

用于线程间传递数据而是用的。

  1. import "fmt"
  2. func sum(nums []int, ch chan int) {
  3. sum := 0
  4. for _, num := range nums{
  5. sum +=num
  6. }
  7. ch <- sum
  8. }
  9. func main() {
  10. nums := []int {1,2,3,4,5,6,7,8,9,10}
  11. ch := make(chan int)
  12. _1nums := nums[:len(nums)/2]
  13. _2nums := nums[len(nums)/2:]
  14. fmt.Println(_1nums)
  15. fmt.Println(_2nums)
  16. go sum(_1nums, ch)
  17. go sum(_2nums, ch)
  18. // 相当于将两个结果放到ch 中。
  19. x, y := <-ch, <-ch
  20. fmt.Println(x, y, x+y)
  21. }