Go语言学习四

95 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

go语言的结构体

package main

import "fmt"

type Books struct {
   title   string
   author  string
   subject string
   book_id int
}

func main() {
   //创建一个新的结构体
   fmt.Println(Books{"Go", "Tom", "Go语言教学", 12345})

   //使用键值对格式
   fmt.Println(Books{title: "C语言", author: "Jerry", subject: "C语言入门", book_id: 12123})

   //忽略的字段为空 或 0
   fmt.Println(Books{title: "C++", author: "哇咔咔"})

   //要访问结构体成员,需要使用.点号操作符,格式为:结构体.成员名
   var book Books
   book.title = "Java"
   book.author = "snoobe"
   book.subject = "Java面试宝典"
   book.book_id = 10086

   //打印book的信息
   fmt.Println(book.title, book.author, book.subject, book.book_id)
}

go语言的切片

package main

import "fmt"

func printSlice(x []int) {
   fmt.Printf("len = %d cap = %d slice = %v\n", len(x), cap(x), x)
}

/*
切片是可以索引的,由len()方法来获取长度
切片提供了计算容量的方法cap()可以测量切片最长可以达到多少
*/
func main() {
   //定义切片
   var num = make([]int, 3, 5)
   //切片的类型为整型数组,长度为三,容量为五
   printSlice(num)

   var slice1 []int = make([]int, 3)

   printSlice(slice1)

   //空切片:一个切片在未初始化之前默认为nil,长度为0
   var slice2 []int
   printSlice(slice2)
   if (slice2 == nil) {
      fmt.Printf("切片是空的")
   }

   //切片截取:通过设置下限和上限来截取切片

   slice3 := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
   printSlice(slice3)

   //打印原始切片
   fmt.Println("slice3 == ", slice3)

   //打印子切片从索引1 到索引4(不包含)
   fmt.Println("slice3[1 : 4] == ", slice3[1:4])

   //默认下限为0
   fmt.Println("slice3[: 3] == ", slice3[:3])

   //默认上限为len(s)
   fmt.Println("slice3[4 :] == ", slice3[4:])

   slice4 := make([]int, 0, 5)
   printSlice(slice4)

   //打印子切片从索引0 到 索引2(不包含)
   slice5 := slice3[:2]
   printSlice(slice5)

   //打印子切片从索引2 到索引5(不包含)
   slice6 := slice3[2:5]
   printSlice(slice6)

   // append() 和 copy()函数
   //如果向增加切片的容量,我们需要创建一个更大的切片并把原切片的内容拷贝过去

   var numbers []int
   printSlice(numbers)

   //追加空切片
   numbers = append(numbers, 0)
   printSlice(numbers)

   //向切片添加一个新元素
   numbers = append(numbers, 1)
   printSlice(numbers)

   //同时添加多个元素
   numbers = append(numbers, 2, 3, 4)
   printSlice(numbers)

   //创建切片 numbers1 是之前切片的两倍容量
   numbers1 := make([]int, len(numbers), (cap(numbers))*2)

   //拷贝numbers 的内容到numbers1
   copy(numbers1, numbers)
   printSlice(numbers1)
}

go语言的范围

package main

import (
   "fmt"
)

func main() {
   /*
      Go的语言范围:Go语言中 range 关键字用于 for 循环中迭代数组(array)、
      切片(slice)、通道(channel)和集合(map)的元素。在数组和切片中,
      它返回元素的索引和索引对应的值,在集合中返回键值对。
      for循环的 range 格式可以对上述类型进行迭代循环
   */

   //遍历简单的数组,2**%d的结果为索引对应的次方数
   var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}
   for i, v := range pow {
      fmt.Printf("2**%d = %d\n", i, v)
   }

   //for循环的range格式可以省略key 和 value
   map1 := make(map[int]float32)
   map1[1] = 1.0
   map1[2] = 2.0
   map1[3] = 3.0
   map1[4] = 4.0

   //读取 key 和 value
   for key, value := range map1 {
      fmt.Printf("key:%d  value:%f\n", key, value)
   }

   //读取key
   for key := range map1 {
      fmt.Printf("key : %d\n", key)
   }

   //读取value
   for _, value := range map1 {
      fmt.Printf("value is %f\n", value)
   }

   //range 遍历其他数据结构
   nums := []int{2, 3, 4}
   sum := 0
   for _, num := range nums {
      sum += num
   }
   fmt.Println("sum :", sum)

   //索引
   for i, num := range nums {
      if num == 4 {
         fmt.Println("index:", i)
      }
   }

   //map的键值对
   kvs := map[string]string{"a": "apple", "b": "banana"}
   for k, v := range kvs {
      fmt.Printf("%s->%s\n", k, v)
   }

   //枚举字符串
   for i, c := range "abc" {
      //第一个参数是字符的索引,第二个是字符本身的值。
      fmt.Println(i, c)
   }
}