データ型2に移動

データ型2に移動

ポインタ型

  • GoポインターとC ++ポインターは逆の順序です。例を参照してください。
package main

import "fmt"

func main() {
	param := 100
	var lp *int = &param
	fmt.Println("data = ", *lp)
}
  • Goの* intはC ++のint *、Goの** intはC ++のint **です。
  • GoポインタとC ++の違いは次のとおりです。
1. Go的指针没有->运算符, 通过.来调用
2. Go的空指针是如下定义的 —— var lp *int = nil
  • GoのスコープはC ++に似ていますが、関数などがすべてスコープであり、Pythonと同じではないため、ポインタータイプはスコープ全体で値を変更できます。これは、ポインタータイプの利点でもあります。

アレイ

  • 1次元配列の初期化
var arr_1 [3]int = [3]int{1, 2, 3}
// 前后必须对应, 前面是[3], 后面也是[3],
  • 2次元配列の初期化:
arr := [1][2]int{
   
   {1, 2}}


var arr [1][2]int
arr = [1][2]int{
   
   {1, 2}}
// 未初始化的元素全部被设置成0
  • 配列の唯一の比較演算子は==と!です。=、まったく同じだけです==
  • Goの配列は、C ++とは異なり、関数パラメーターとして値で渡されるため、関数で変更する場合は、ポインターを渡す必要があります。
  • Goの配列ポインタは次のようなものです。
arr := [3]int{1, 2, 3}
var lp *[3]int = &arr
fmt.Printf("%T", lp)

注:
配列の[]と配列ポインターは対応している必要があり、3がその上に書き込まれ、3も配列ポインターに書き込まれている必要があります

スライス

  • スライスは配列と非常によく似ており、[]で記述された特定のlenは配列であり、空はスライスです。
  • スライスの作成方法:
arr := []int{1, 2, 3}
arr := make([]int, 2, 5) // 2是len, 5是cap容量
arr := make([]int, 2)
  • スライスの容量は> =スライスの長さでなければなりません
  • 配列から生成されたスライスは、基になる配列に影響します
package main

import "fmt"

func main() {
	arr := [3]int{1, 2, 3}
	s := arr[0:2]  // 截取[0, 2)的切片, 容量会由系统为你指定也可以自己写
	s[0] = 10
	fmt.Println(arr)
	// 这时候就变成了10 2 3
}
  • 追加関数の使用-元のスライスの最後に新しい要素を追加することです
package main

import "fmt"

func main() {
	s := []int{}
	s = append(s, 1)
	fmt.Println(s)
}

ここに画像の説明を挿入

  • コピー機能は、その名前が示すように、要素をコピーすることです
package main

import "fmt"

func main() {
	s1 := []int{1, 1}
	s2 := []int{3, 3, 3}
	copy(s2, s1) // 把s1的元素拷贝到s2, 最后的结果为1, 1, 3
	fmt.Println(s2)
}
  • 関数パラメーターとしてのスライスは値で渡されません。元のスライスに影響します。
package main

import "fmt"

func change(s []int) {
	s[0] = 10
}

func main() {
	s1 := []int{1, 1}
	change(s1)
	fmt.Println(s1)// 结果是10 1
}

地図

  • Goのマップは、C ++のマップとPythonのdictとの類推によって理解できます。
  • マップの作成は次のとおりです-[]がキーで、その後に値が続きます
var mp1 map[int]int

mp2 := make(map[int]int) // 此处可以指定初始的容量cap, 但是一旦元素len超过cap会自动扩容

mp3 := map[int]int{1: 1, 2: 2}
  • マップのキーは一意であり、キーはスライスなどの参照セマンティクスを持つ変数にすることはできません。==および!をサポートする必要があります。=
  • マップのデフォルトの割り当て操作は、キーと値のペアを作成することです
  • マップが存在しないキーにアクセスすると、空または0の同様のvデータが返されます
  • マップの要素を削除します。
package main

import "fmt"

func main() {
	mp := map[int]string{1: "1", 2: "2"}
	delete(mp, 1) // 删除mp之中key为1的键值对

	fmt.Println(mp)
}
  • マップには参照セマンティクスがあります。次の例を参照してください。
package main

import "fmt"

func f(mp map[int]string) {
	delete(mp, 1)
}

func main() {
	mp := map[int]string{1: "1", 2: "2"}
	f(mp)
	fmt.Println(mp)
}

構造

  • タイプに名前が変更された構造の定義
type Person struct {
	age int
	name string
	sex bool
}

注:
その中の変数はvarを書く必要はありません

  • 構造の初期化:
// 完全初始化, 必须写完整
var person Person = Person{10, "xiaohua", true}
// 部分初始化, 剩下的自动填充为0
person1 := Person{age:15}
  • 構造体ポインタ
package main

import "fmt"

type Person struct {
	age int
	name string
	sex bool
}

func main() {
	var person *Person = &Person{10, "xiaohua", true}
	fmt.Println(*person)

	person1 := &Person{age:15}
	fmt.Println(*person1)
}
  • 構造体変数の内部メンバーと変数ポインター操作はすべてによって操作されます。
package main

import "fmt"

type Person struct {
	age int
	name string
	sex bool
}

func main() {
	var person *Person = &Person{10, "xiaohua", true}
	person.age = 20 // 等价于(*person).age = 20
	fmt.Println(*person)
}
  • 関数パラメーターとしての構造体は値によって渡されます

おすすめ

転載: blog.csdn.net/weixin_43891775/article/details/113095858