go基础三 数组,切片,map,list

Go语言数据结构解析
本文深入探讨了Go语言中的数组、切片、map和list等数据结构的特点与使用方法,详细讲解了每种数据结构的声明、初始化和遍历过程,并对比了它们之间的差异。

数组:

1、Go 语⾔言提供了了数组类型的数据结构。 数组是具有相同类型的⼀一组⻓长度固定的数据序列列,这种类型可以是任意的基本数据类型或复合数据类型及⾃自定义类Go内置容器器——数组和切⽚片型。   

2、数组元素可以通过索引下标(位置)来读取或者修改元素数据。索引从0开始,第⼀一个元素索引为 0,第⼆二个索引为 1,以此类推。数组的下标取值范围是从0开始,到⻓长度减1。

3、数组⼀一旦定义后,⼤大⼩小不不能更更改。

声明:

  

func main() {
  a := [4]float64{67.7, 89.8, 21, 78}
  b := [...]int{2, 3, 5}
  // 遍历数组⽅方式 1
  for i := 0; i < len(a); i++ {
    fmt.Print(a[i], "\t")
  }
  fmt.Println()
  // 遍历数组⽅方式 2
  for _, value := range b {
    fmt.Print(value, "\t")
  }
}

切片:

  Go 数组的⻓长度不不可改变,在特定场景中这样的集合就不不太适⽤用,Go中提 供了了⼀一种灵活,功能强悍的内置类型切⽚片("动态数组");

   与数组相⽐比切⽚片的⻓长度是不不固定的,可以追加元素,在追加时可能使切⽚片 的容量量增⼤大。

  切⽚片本身没有任何数据,它们只是对现有数组的引⽤用。 切⽚片与数组相⽐比,不不需要设定⻓长度,在[]中不不⽤用设定值,相对来说⽐比较⾃自 由 从概念上⾯面来说slice像⼀一个结构体,这个结构体包含了了三个元素: 指针,指向数组中slice指定的开始位置 ⻓长度,即slice的⻓长度 最⼤大⻓长度,也就是slice开始位置到数组的最后位置的⻓长度

func main() {
    var x = make([]int,3,5)
    fmt.Printf("%T\n" , x)
    fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

map  

  map是Go中的内置类型,它将⼀一个值与⼀一个键关联起来。可以使⽤用相应的键检索值。有资料料翻译成地图、映射或字典。但是⼤大多数习惯上翻译成集合。  

  map 是⼀一种⽆无序的键值对(key-value pair )的集合。map通过 key 来快速检索数据,key 类似于索引,指向相应的value值。       

  map 是⼀一种集合,所以可以像遍历数组或切⽚片那样去遍历它,不不过map是⽆无序的,所以⽆无法决定它的展示顺序,这是因为 map 是使⽤用 hash 表来实现的

  

var country = map[string]string{
"China": "Beijing",
"France": "Paris",
"Italy": "Rome",
"Japan": "Tokyo",
//"Japan": "Tokyo2" , //key 名不不能重复
}
package main

import "fmt"

func main() {
    a :=make(map[string]string)
    a["a"]="a"
    a["b"]="b"
    for i,v :=range a{
        fmt.Println(i,v)
    }
    delete(a,"a")
    for i,v :=range a{
        fmt.Println(i,v)
    }
    a["a"]="c"
    for i,v :=range a{
        fmt.Println(i,v)
    }
}

 

 

list :

1、通过container/list包的New⽅方法声明list 变量量名 := list.New()

2、通过var声明list var 变量量名 list.List list与切⽚片和map不不同,没有具体元素类型的限制。list中的元素可以是任 意类型。 在CPP⾥里里⾯面,list的成员必须是同⼀一个数据类型,但是Go语⾔言中却允许list 中插⼊入任意类型的成员。 建议使⽤用New()实现声明list

package main

import (
    "fmt"
    "container/list"
)

func main() {
    copyList()
}
//list 是值类型,不不过采⽤用 New ()⽅方法声明的是⼀一个指针。所以在拷⻉贝操作和
//参数传递时具有引⽤用类型的特征。
func copyList() {
    // 声明 list1copyList()
    list1 := list.New()
    printListInfo2("刚声明的list1:", list1)
    // 给 list1 赋值
    list1.PushBack("one")
    list1.PushBack(2)
    list1.PushBack("three")
    list1.PushFront("first")
    printListInfo2("赋值后的list1", list1)
    iterateList2(list1)
    // 将 list1 拷⻉贝给 list2 。其实拷⻉贝的是地址
    list2 := list1
    printListInfo2("刚拷⻉贝的list2", list2)
    iterateList2(list2)
    //list2 修改后
    list2.PushBack(250)
    list2.PushBack(350)
    list2.PushBack(450)
    printListInfo2("修改后的list2", list2)
    iterateList2(list2)
    //list2 的修改是否影响到 list1 ?
    printListInfo2("修改list2的list1", list1)
    iterateList2(list1)
}
func printListInfo2(info string, l *list.List) {
    fmt.Println(info + "----------")
    fmt.Printf("%T:%v \t , ⻓长度为:%d \n", l, l, l.Len())
    fmt.Println("----------")
}
func iterateList2(l *list.List) {
    i := 0
    for e := l.Front(); e != nil; e = e.Next() {
        i++
        fmt.Printf("%d:%v \t", i, e.Value)
    }
    fmt.Println("\n----------")
}

 

### 关于数组 `map` 方法的使用 在 JavaScript 中,`map()` 是一种强大的数组方法,用于对数组中的每个元素执行指定的操作并返回一个新的数组。新数组的长度与原数组相同,其元素由回调函数的返回值组成。 以下是 `map()` 的基本语法: ```javascript array.map(callback(currentValue[, index[, array]])[, thisArg]) ``` 其中: - `callback`: 对数组中每个元素调用的函数。 - `currentValue`: 当前正在处理的元素。 - `index` (可选): 正在处理的元素的索引。 - `array` (可选): 调用了 `map` 方法的原始数组。 - `thisArg` (可选): 执行回调时使用的 `this` 值。 #### 示例代码 以下是一个简单的例子,展示如何使用 `map()` 将数组中的每个数字加倍[^1]: ```javascript const numbers = [1, 2, 3, 4, 5]; const doubled = numbers.map(function(num) { return num * 2; }); console.log(doubled); // 输出: [2, 4, 6, 8, 10] ``` 如果希望代码更简洁,还可以使用箭头函数[^4]: ```javascript const numbers = [1, 2, 3, 4, 5]; const squared = numbers.map(num => num ** 2); console.log(squared); // 输出: [1, 4, 9, 16, 25] ``` #### 处理复杂数据结构 当数组中的元素是对象时,可以通过解构赋值和扩展运算符来修改对象的部分属性[^5]。例如: ```javascript const items = [ { id: 1, name: '苹果', price: 5 }, { id: 2, name: '香蕉', price: 3 } ]; const updatedItems = items.map(item => ({ ...item, price: item.price + '元', stock: true })); console.log(updatedItems); // 输出: // [ // { id: 1, name: '苹果', price: '5元', stock: true }, // { id: 2, name: '香蕉', price: '3元', stock: true } // ] ``` #### 其他编程语言中的类似功能 虽然 `map` 方法起源于函数式编程语言,但它已被许多现代编程语言支持。例如,在 Python 和 Go 中也有类似的实现[^2][^3]。 - **Python**: 使用列表推导式或内置的 `map()` 函数。 ```python numbers = [1, 2, 3, 4, 5] doubled = list(map(lambda x: x * 2, numbers)) print(doubled) # 输出: [2, 4, 6, 8, 10] ``` - **Go**: 需要手动遍历切片并构建新的切片。 ```go package main import ( "fmt" ) func main() { numbers := []int{1, 2, 3, 4, 5} doubled := make([]int, len(numbers)) for i, v := range numbers { doubled[i] = v * 2 } fmt.Println(doubled) // 输出: [2 4 6 8 10] } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值