Go学习第一天-数据类型

95 阅读3分钟

数组

数组是一个长度固定的数据类型,用于存储一段具有相同类型的元素的连续块。其占有的内存是连续的。

基础使用

package main
​
import "fmt"func main(){
​
  // 声明一个数组,并设置为0值
  var arr[5] int
  fmt.Println(arr)
​
  // 使用数组字面量声明
  arr1 := [5]int{1,2,3,4,5}
  fmt.Println(arr1)
​
  // 让编译器自动计算数组长度
  arr2 := [...]int{5,4,3,2,1,0}
  fmt.Println(arr2)
​
  // 声明数组并制定特定元素的值
  arr3 := [...]int{1:10 ,2:20}
  fmt.Println(arr3)
​
  arr3[0] = 50// 声明二维数组并初始化
  var arr4 [4][2]int
  fmt.Println(arr4)
​
  arr5 := [4][2]int{{1,2},{3,4},{5,6},{7,8}}
  fmt.Println(arr5)
​
​
  // 数组可以直接拷贝
  var str1[3] string
  str2 := [3]string{"binshow" , "zkd" , "love"}
  str1 = str2
  fmt.Println("str1 = " , str1)
  fmt.Println("str2 = " , str2)
​
}
​
​

函数间传递

在Go中函数之间传递变量时,都是以值的方式来进行传递的。如果变量时一个数组,那拷贝整个数组开销太大了!

所以一般数组的传递就只传递数组的指针就好了,这样只需要8个字节:

package main
​
import "fmt"func main(){
  str := [3]string{"binshow" , "zkd" , "love"}
  fmt.Println("str = " , str)
  foo(&str)
  fmt.Println("After foo : str = " , str)
}
​
// 因为传递的是指针,所以在函数中修改数组,原数组也会跟着一起变
func foo(arr *[3]string) {
  arr[2] = "forever"
  return
}
​
​

切片

切片是一个很小的对象,对底层数组进行了抽象并提供了相应了操作方法。

切片由三个字段组成:指向底层数组的指针、长度、容量。

基本使用

package main
​
import "fmt"func main(){
​
  // 创建一个字符串切片,其长度和容量都是5
  slice1 := make([]string , 5)
  fmt.Println(slice1)
​
  // 创建一个字符串切片,长度为3,容量为5
  slice2 := make([]string , 3 , 5)
  fmt.Println(slice2)
​
  // 声明切片
  slice3 := []string{"binshow" , "zkd" ,"love"}
  fmt.Println(slice3)
​
  // 声明数组和声明切片的区别
  arr := [3]int{1,2,3}
  slice4 := []int{1,2,3}
  fmt.Println(arr , slice4)
​
  // 切片增长: 如果切片的底层数组还有额外的容量可以使用,append操作就会将可用的元素合并到切片的长度,并进行赋值。
  //      和原来的slice共享同一个底层数组。 如果切片的底层数组没有足够的额外容量,则append函数会创建一个新的底层数组。将现有的值复制到新数组中
  slice4 = append(slice4 , 5)
  fmt.Println(slice4)
​
  // 迭代切片
  for i ,v := range slice4{
    fmt.Printf("index : %d , value : %d \n" , i , v)
  }
​
}
​
​

函数间传递

映射

基本使用

package main
​
import "fmt"func main(){
​
  // 创建一个map , key 为string,value为int类型
  dict1 := make(map[string]int)
  fmt.Println(dict1)
​
  // 初始化一个map
  dict2 := map[string]string{"Red" : "#da1337" , "Orange" : "#e95a22"}
  fmt.Println(dict2)
​
  // 添加映射
  dict2["Blue"] = "#da3735"
  fmt.Println(dict2)
​
  // 判断键是否存在
  value , exists := dict2["Yellow"]
  if exists {
    fmt.Println("value = " , value)
  }
​
  value = dict2["Blue"]
  if value != " " {
     fmt.Println("value = " , value)
  }
​
  // 迭代map
  for key , value := range dict2{
    fmt.Printf("key : %s , value : %s \n" , key ,value)
  }
​
  // map中删除键值对
  delete(dict2 , "Red")
  fmt.Println("after delete red: ")
  for key , value := range dict2{
    fmt.Printf("key : %s , value : %s \n" , key ,value)
  }
​
}
​
​

函数间传递

package main
​
import "fmt"func main(){
​
  // 创建一个map , key 为string,value为int类型
  dict1 := make(map[string]int)
  fmt.Println(dict1)
​
  // 初始化一个map
  dict2 := map[string]string{"Red" : "#da1337" , "Orange" : "#e95a22"}
  fmt.Println(dict2)
​
  // 添加映射
  dict2["Blue"] = "#da3735"
  fmt.Println(dict2)
​
​
  // 迭代map
  for key , value := range dict2{
    fmt.Printf("key : %s , value : %s \n" , key ,value)
  }
​
  // 传递参数,原来的map也改变了,说明和切片一样,传递的是地址
  removeColor(dict2 , "Blue")
​
  fmt.Println("after removeColor function: ")
  for key , value := range dict2{
    fmt.Printf("key : %s , value : %s \n" , key ,value)
  }
​
}
​
func removeColor(dict map[string]string , key string){
  delete(dict , key)
}
​