06配列、スライス、マップ

アレイ

配列は同じタイプの複数のデータを格納できます。
配列定義:var配列名[配列サイズ]データ型
配列要素へのアクセス:配列名[添え字]、添え字は0から始まり
ます配列のアドレスは配列名と配列で取得できます名前
各配列要素のアドレス間隔は、次のように、配列内のデータのタイプに従って決定されます。int64-> 8 int32-> 4

  1. 宣言されると、配列の長さは固定され、動的に変更することはできません
  2. var arr [] intがこのように定義されている場合、実際にはスライスが定義されます
  3. 配列内の要素は任意のデータ型にすることができますが、混在させることはできません
  4. 配列が作成された後、値が割り当てられていない場合、データ型のデフォルト値がデフォルトで保存されます
  5. 配列がパラメータとして使用される場合、値によって渡されます(新しい値を割り当てます)。他のメソッドで配列を変更する場合は、ポインタを介して配列を操作する必要があります。6。
    配列の長さはの一部です。配列。長さが一貫していない配列を関数に渡すことはできません。

サンプルコード

func test07(){
    
    
	//数组的声明及使用
	var arr01 [3] int
	arr01[0] = 1
	arr01[1] = 2
	//数组的声明及使用
	arr02 :=[3]int{
    
    1,2,3}
	fmt.Println(arr01,arr02)

	var arr03 = [...]int{
    
    8,9,11,1}
	var arr04 = [...]int{
    
    1:8,2:9,3:11,0:1}
	fmt.Println(arr03,arr04)
	//数组遍历
	for i:=0;i<len(arr01);i++{
    
    
		fmt.Println(i,arr01[i])
	}
	//数组遍历2
	for index,value :=range arr01{
    
    
		fmt.Println(index,value)
	}
}

スライス

スライスは配列への参照であるため、スライスはこのタイプを参照します。関数を呼び出すときは、参照転送のメカニズムに従います。スライスの操作は配列と同じですが、スライスの長さを変更できます。 。これは可変長配列
定義構文です。varsliceName[] type(arrayとの違いは、長さを指定する必要がないことです)

注意点

  1. 最下位レベルから見ると、スライスは実際には、配列参照、長さ、容量などの属性を持つデータ構造構造体です。
  2. スライスの長さは動的に成長することができる
    (S)= ARR [0:終了]はSに等しい:= ARR [:END]
    S:= ARRは、[開始:lenの(ARR)] Sと等価である:= ARR [開始]
    の:= arr [0:len(arr)]はs:= arr:]と同等です
  3. スライス定義が完了すると、使用できなくなります。配列を参照したり、スライス用のスペースを作成したりするために使用する必要があります。
  4. スライスはスライスを続けることができます
  5. append組み込み関数を使用して、スライスを動的に
    追加します。appendは、新しい配列を作成し、元のスライスの要素を新しいスライスにコピーします。スライスも作成されます。テスト結果は、元のスライスが変更されていないことを示しています。
  6. 組み込み関数のコピーを使用してコピーを完了し、あるスライスの要素を別のスライスにコピーして、割り当てられた要素の数を返します。

サンプルコード

func test08(){
    
    
	var intArr = [...]int{
    
    1,2,3,4,5}
	fmt.Println(intArr)
	//定义切片方式1
	slice := intArr[1:3]
	fmt.Println(len(slice))//长度2
	fmt.Println(cap(slice))//容量4
	fmt.Println(slice) //2,3
	intArr[1] = 7
	fmt.Println(slice) //2,3 //修改原数组后 切边也会变

	s11 := intArr[:]
	s12 := append(s11,5,6,7,8) 
	//append 后产生新的切片,原切片不变
	fmt.Println(s11,s12)
	var ss0 = []int{
    
    1,2,3,4,5}
	var ss1 = make([]int,10)
	ss2 := copy(ss1,ss0)
	fmt.Printf("ss2类型 %T \n",ss2)//int
	fmt.Println("====>",ss0,ss1,ss2)
   
	//定义切片方式2  这种方式可以指定 切片的大小和容量
	// 这种方式定义的切片对应的数组是由make底层去维护,对外不可见
	var s2 [] int = make ([]int ,5,10)
	fmt.Println(len(s2))//5
	fmt.Println(cap(s2))//10
	fmt.Println(s2) //2,3

	//定义切片方式3
   //这种方式和make定义方式类似,
   var s1 []int =[]int{
    
    1,2,3,4,5}
   fmt.Println(cap(s1))//容量4
   fmt.Printf("s1类型 %T,slice类型 %T ,intArr类型%T \n",s1,slice,intArr)
	/*
		方式1 和方式2 的区别,
		方式1 直接引用数组,数组事先存在,程序员可见,修改原数组后 切片也会变
		方式2 make会自动创建一个数组由切片底层维护,程序员不可见
	*/
}

文字列とスライス

  1. 文字列の最下層はバイト配列であるため、スライスすることもできます
  2. 文字列は不変です。文字列を変更する必要がある場合は、最初に文字列をバイト配列またはルーン配列に変換し、変更後に文字列を再構築する必要があります。
str01 := "1231231";
strsl := str01[1:]
fmt.Println(strsl)//231231

二次元配列

要素は1次元配列の配列であり、次のような2次元配列
構文var 数组名[大小][大小]类型です。var arr[2][2]int
サンプルコード

func test09(){
    
    
	//二维数组使用方式1
	//先声明再赋值
	var arr [2][3]int
	arr[0][1] = 10
	fmt.Println("二维数组长度",len(arr))
	fmt.Printf("arr[0]的地址 %p \n",&arr[0])
	fmt.Printf("arr[1]的地址 %p \n",&arr[1])
	//二维数组使用方式2
	//直接初始化 /四种方法
	var arr01 [2][3]int = [2][3]int{
    
    {
    
    1,2,3},{
    
    4,5,6}}
	var arr02 [2][3]int = [...][3]int{
    
    {
    
    1,2,3},{
    
    4,5,6}}
	var arr03 = [2][3]int{
    
    {
    
    1,2,3},{
    
    4,5,6}}
	var arr04 = [...][3]int{
    
    {
    
    1,2,3},{
    
    4,5,6}}
	
	fmt.Println(arr01,arr02,arr03,arr04);

	//遍历
	//双层for循环
	for i:=0;i<len(arr);i++{
    
    
		for j:=0;j<len(arr[i]);j++ {
    
    
			fmt.Println(i,j,"==>",arr[i][j])
		}
	}
	//for range
	for i,v := range arr{
    
    
		for j,v2 := range v{
    
    
			fmt.Println(i,j,"==>",v2)
		}
	}
}

地図

マップは、他のプログラミング言語のコレクション
宣言構文と同様に、フィールドまたは連想配列とも呼ばれるKey-Valueデータ構造です。var map 变量名 map[keytype]valuetype

Golangのmapのキーは、ブール値、文字列、ポインタ、チャネル、インターフェイス、構造体、配列など、複数のタイプにすることができます。通常、キーは文字列と整数です。スライス、マップ、関数は使用できません。key、 ==を使用して判断する方法がないためです。
基本的に同じタイプのキーと値、通常はデジタル、文字列、マップ、構造体
注意事項

  1. 地図は自動的に展開できます
  2. マップは参照型です。関数内のマップパラメータの値を変更すると、関数外のマップのコンテンツに影響します。

サンプルコード

func test12(){
    
    
	//map 排序 map是无序的,
	//排序是先将key 排序,再根据排序后的key获取值
	map1 := map[int]int{
    
    
		1:1,
		2:2,
		10:10,
		9:9,
	}
	//直接遍历
	for k,v := range map1{
    
    
		fmt.Println(k,v)
	}

	//排序遍历
	var keys []int
	for k,_ :=range map1{
    
    
		keys = append(keys,k)
	}
	sort.Ints(keys)
	fmt.Println(keys)
	for _,k := range keys{
    
    
		fmt.Println(k,map1[k])
	}
}
func test11(){
    
    
	//map切片
	var monsters []map[string]string
	monsters = make([]map[string]string,1)
	monsters[0] = make(map[string]string,2)
	monsters[0]["name"]="zhansan"
	monsters[0]["age"]="19"
	//由于切片容量为1 所以以下代码会报错
	//panic: runtime error: index out of range
	// monsters[1] = make(map[string]string,2)
	// monsters[1]["name"]="zhansan2"
	// monsters[1]["age"]="192"

	newMonster :=map[string]string{
    
    
		"name":"lisi",
		"age":"32",
	}

	monsters = append(monsters,newMonster)
	fmt.Println(monsters)


}
func test10(){
    
    
	//map 使用方式1
	var m map[string]string
	//声明后必须调用make 分配空间后才可以使用
	m = make(map[string]string,10)
	m["name"] = "zhangsan"
	m["age"] = "20"
	fmt.Println(m,len(m))

	//map使用方式2
	cities := make(map[string]string)
	cities["1"] = "北京"
	cities["2"] = "上海"
	cities["3"] = "天津"
	fmt.Println(cities,len(cities))

	//map使用方式3
	cities2 := map[string]string {
    
    
		"01" : "北京",
		"02" : "上海",
		"03" : "天津",
	}
	cities2["01"] = "北京01" //添加值
	fmt.Println(cities2,len(cities2))
	delete(cities2,"01")//删除值
	fmt.Println(cities2,len(cities2))

	val,ok := cities2["01"]//查询值
	if ok {
    
    
		fmt.Println("存在取值为:",val)
	}else{
    
    
		fmt.Println("值不存在:")
	}
	fmt.Println("=============>遍历")
	for k,v := range cities2{
    
    
		fmt.Println(k,v)
	}


}

おすすめ

転載: blog.csdn.net/zhangxm_qz/article/details/114445537