NipGeihou's blog NipGeihou's blog
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档

NipGeihou

我见青山多妩媚,料青山见我应如是
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档
  • Java视角看Go

    • 前言
    • 环境安装
    • 介绍
    • 基本语法
    • 集合
      • 数组
        • 定义
        • 存在的问题
      • Slice(类似ArrayList)
        • 定义
        • 操作
      • map(类似HashMap)
        • 定义
        • 操作
    • 面向对象
    • 反射
    • 协程
    • 常见库
  • other

  • 笔记

  • 代码片段

  • Golang
  • Java视角看Go
NipGeihou
2022-12-31
目录

集合

# 数组

声明时必须指定数组的长度,且长度是数组类型的一部分,因此数组的长度是固定的,不能动态增加或减少。

# 定义

func main() {
	var arr1 [3]int
	arr1[0] = 1

	arr2 := [10]int{1, 2, 3} // 没有赋值的元素默认为0
	
	// 类似于Java中的for循环
	for i := 0; i < len(arr1); i++ {
		fmt.Println(arr1[i])
	}

	// 类似于Java中的foreach循环
	for index, value := range arr2 {
		fmt.Println(index, value)
	}

	printArray(arr2)
}

func printArray(arr [10]int) {
	for index, value := range arr {
		fmt.Println(index, value)
	}
}

# 存在的问题

  • 函数入参为数组时,需要指定数组的长度,如果数组长度不一致,则会报错,因此需要使用切片
  • 函数传递数组时,实际上是传递了数组的副本,因此需要使用指针

# Slice(类似 ArrayList)

不指定长度的数组就是 Slice(切片),也就是动态数组

# 定义

func main() {
	var slice1 []int
	slice2 := []int{1, 2, 3}
	// 3表示长度,5表示容量(可选,类似于Java中的ArrayList的初始容量)
	slice3 := make([]int, 3, 5) 

	// 类似于Java中的for循环
	for i := 0; i < len(slice1); i++ {
		fmt.Println(slice1[i])
	}

	// 类似于Java中的foreach循环
	for index, value := range slice2 {
		fmt.Println(index, value)
	}
	
	// 类似于Java中的foreach循环
	for index, value := range slice3 {
		fmt.Println(index, value)
	}
}

func printSlice(slice []int) {
	for index, value := range slice {
		fmt.Println(index, value)
	}
}

# 操作

func main() {
	slice := []int{1, 2, 3, 4, 5}
	
	// 追加
	slice = append(slice, 6)

	// 容量,类似于Java中的ArrayList的初始容量,并不是数组的长度
	fmt.Println(cap(slice))

	// 长度,类似于Java中的ArrayList的size
	fmt.Println(len(slice))

	// 截取,浅拷贝
	fmt.Println(slice[1:3]) // 左闭右开
	fmt.Println(slice[1:]) // 从1开始到最后
	fmt.Println(slice[:3]) // 从0开始到3

	// 深拷贝
	slice2 := make([]int, len(slice), cap(slice))
	copy(slice2, slice)
	


}
  • 扩容:当 slice 的容量不够时,会自动扩容,扩容为原来的 2 倍

# map(类似 HashMap)

# 定义

func main() {
	// 声明方式1
	// 类似Map<String, Integer> map1;
	var map1 map[string]int // 声明,此时map1为nil
	// 类似map1 = new HashMap<>();
	map1 = make(map[string]int, 10)
	map1["key1"] = 1
	map1["key2"] = 2

	// 声明方式2
	map2 := map[string]int{
		"key1": 1,
		"key2": 2,
	}

	// 声明方式3
	map3 := make(map[string]int, 10)

}

# 操作

func main() {
	map1 := map[string]int{
		"key1": 1,
		"key2": 2,
	}

	// 获取
	fmt.Println(map1["key1"])

	// 删除
	delete(map1, "key1")

	// 遍历
	for key, value := range map1 {
		fmt.Println(key, value)
	}

	// 判断key是否存在
	value, ok := map1["key1"]
	if ok {
		fmt.Println(value)
	} else {
		fmt.Println("key1不存在")
	}
}
上次更新: 2022/12/31, 03:13:11
基本语法
面向对象

← 基本语法 面向对象→

最近更新
01
元器件
05-23
02
iSCSI服务搭建
05-10
03
磁盘管理与文件系统
05-02
更多文章>
Theme by Vdoing | Copyright © 2018-2025 NipGeihou | 友情链接
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式