02Golang変数とデータ型

変数の定義と使用

変数定義構文:var 变量名 数据类型
ローカル変数:ステートメントブロックで定義された変数(メソッドなど)
グローバル変数:ステートメントブロックの外部で定義された変数

変数宣言方法:

  1. 変数タイプを指定し、宣言後に値が割り当てられていない場合はデフォルト値を使用します
  2. 値に基づいて変数タイプを判断します
  3. varを省略してuse:=割り当てを行うと、左側の変数をまだ宣言できません。宣言しないと、エラーが報告されます。
  4. 多変数宣言をサポートします(ローカル変数とグローバル変数の両方がサポートされます)。サンプルコードを参照してください。

サンプルコード

//全局变量声明
var gn1 = 100
var gn2 = "jack"
//一次声明多个全局变量
var (
	gn3 = 200
	gn4 = "mary"
)

func test(){
    
    
	//变量使用方式1:指定变量类型,声明后如果不赋值则使用默认值
	var i  int
	fmt.Println("i1=",i)

	//变量使用方式2:根据值自行判断变量类型
	var i2 = 2
	fmt.Println("i2=",i2)

	//变量使用方式3:省略var 使用 := 赋值,左侧变量不能是已经声明过的,否则报错
	i3 := "4"
	fmt.Println("i3=",i3)


	//一次声明多个变量 方式1
	var n1, n2, n3 int
	fmt.Println("n1=",n1,"n2=",n2,"n3=",n3)

	//一次声明多个变量 方式2
	var n12, n22, n32 = 100, "tom", 200 
	fmt.Println("n1=",n12,"n2=",n22,"n3=",n32)

	
	//一次声明多个变量 方式3
	n13, n23, n33 := 200, "tom", 300 
	fmt.Println("n1=",n13,"n2=",n23,"n3=",n33)

    //输出全局变量
	fmt.Println("全局变量:gn1=",gn1,"gn2=",gn2,"gn3=",gn3,"gn4",gn4)

	n13 = 133  
	//n13 = n23; 该行报错,不能改变变量的类型

}

基本データ型

以下を含む基本的なデータ型
1)数値型:整数:int、int8、int16、int32、int64浮動小数点型:float32、float64
2)文字型:特別な文字型はありません。バイトを使用して単一のアルファベット文字を格納します
3)ブール型:true false
4)文字列:文字列は、基本型の
派生/複雑なデータ型として正式に定義されてい
ます。これには、1)ポインタ
2)配列
3)構造構造
4)チャネル
5)関数
6)スライス
7)インターフェイス
8)マップが含まれます。

整数

符号付き整数、符号なし整数、およびその他のタイプの整数を含む整数を格納する変数。デフォルト値は0です。符号
付き整数:
ここに画像の説明を挿入
符号なし整数:
ここに画像の説明を挿入
その他のタイプの整数:
ここに画像の説明を挿入
サンプルコード:

func test2(){
    
    
	var i int
	fmt.Println("i=",i);
	
	//有符号整型测试
	//var i2 int8 = 128 // 报错超过 constant 128 overflows int8
	var i2 int8 = 127  //正常
	fmt.Println("i2=",i2);

    //无符号整型测试
	//var i3 uint8 = 256 // 报错超过 constant 256 overflows uint8
	//var i3 uint8 = -1  //报错 constant -1 overflows uint8
	var i3 uint8 = 255 //正常
	fmt.Println("i23=",i3);

	//其他类型整型
	var a int = 999
	fmt.Println("a=",a);

	var b unit = 1
	var c byte = 255
	fmt.Println("a=",a,"b=",b,"c=",c);


}

注意点

  1. intとuintのサイズはシステムに関連しており、他のタイプの範囲はシステムとは関係ありません。
  2. 整数宣言のデフォルトタイプは整数です
  3. 変数のサイズと次のメソッドが占めるバイト数を確認してください
    。fmt.Printf( "i3のタイプ%Tが占めるバイト数は%dです"、i3、unsafe.Sizeof(i3))
  4. Golangプログラムで整数変数を使用する場合は、プログラムの通常の動作を満たすことを前提として、小さなスペースを占めるデータ型を使用するようにしてください。

浮動小数点

小数
の格納に使用されるデータ型。マシンでの浮動小数点型の格納形式:浮動小数点数=符号ビット+指数ビット+仮数ビット
デフォルト値0
分類
ここに画像の説明を挿入

サンプルコード

func test3(){
    
    
	var price float32 =12.13
	fmt.Println("price=",price);
	var price2 float32 =-0.000098
	var price3 float64 =-8999.09
	fmt.Println("price2=",price2,"price3=",price3)

	//精度丢失测试
	var price4 float32 =12.130000901
	var price5 float64 =12.130000901
	//输出 price4= 12.130001 price5 12.130000901   float32 发生精度丢失
	//float64 精度比 float32 精度高
	fmt.Println("price4=",price4,"price5",price5)
	var num float64 = 5.12334423e2
	var num2 float64 = 5.123344233E-2
	
}

注意点

  1. 浮動小数点数は署名されています
  2. ビット数が失われ、精度が低下する可能性があります。float64の精度はfloat32より高くありません。
  3. 浮動小数点型はデフォルトでfloat64として宣言されています
  4. 浮動小数点の2つの一般的に使用される表現:
    10進数:5.12 .512には小数点が必要です
    科学的記数法:5.123e2 = 5.12 * 10の2乗5.123E-2 = 5.12 / 10の2乗Eは大文字または小文字にすることができます

文字タイプ

Golangには特殊文字タイプはありません。文字を格納する場合は、通常、バイトを使用して保存します。文字列は、固定長文字の文字列で接続された文字のシーケンスです。Goのストリングルームメイトは1バイトで連結されています。
サンプルコード

func test01(){
    
    
	var c1 byte = 'a'
	var c2 byte = '0'
	fmt.Println("c1=",c1);
	fmt.Println("c2=",c2);
	//c1= 97 c2= 48  tyte输出时默认输出码值  如果希望输出字符串 需要格式化输出
	fmt.Printf("c2= %c c1= %c",c2,c1) //c2= 0 c1= a
	//var c3 byte = '北' // 报错 constant 21271 overflows byte
	var c3 = '北' // 字符被默认成int32 类型
	fmt.Println("c3 =",c3);
	fmt.Printf("c3的类型 %T 占用的字节数是 %d", c3, unsafe.Sizeof(c3))
		//输出:c3的类型 int32 占用的字节数是 4
	var num = 10 + 'a'
	fmt.Println("num = ", num )//输出 107

}

注意点

  1. 保存する文字がASCIIテーブルにある場合は、バイトに直接保存できます。対応する文字のコードが255より大きい場合は、int型で保存できます。
  2. go言語の文字はUTF-8エンコーディング(英語1バイト漢字3バイト)を使用します。文字に対応するutf-8コード値を照会する場合は、http://www.mytju.com/classcodeにアクセスしてください。 /tools/encode_utf8。asp
  3. goの文字は基本的に整数であり、直接出力すると、その文字に対応するUTF-8コードの値を出力します。出力文字はフォーマットして出力する必要がありますfmt.Printf( "c2 =%c c1 =%c"、c2、c1)
  4. 整数を変数に直接割り当てて、対応する文字をフォーマットできます
  5. 文字タイプは、操作可能な整数に相当します。
  6. 文字の種類をコンピュータに保存するには、文字に対応するコード値をバイナリシステムに変換して保存する必要があります。
    ストレージ:文字->コード値->バイナリ->ストレージ読み取り:ストレージの正反対
  7. 文字とコード値の関係は、文字コードテーブル(事前に指定された)によって決定されます
  8. Go言語コーディングはutf-8を均一に使用します。これは、コードの文字化けの問題なしに非常に便利です。

ブール型

bool型では、trueとfalseの2つの値のみが許可され、
デフォルト値は1バイトを占めます
。falseサンプルコード

 func test02(){
    
    
	var b = false
	fmt.Println(b)
	//b的类型 bool 占用的字节数是 1
	fmt.Printf("b的类型 %T 占用的字节数是 %d",b , unsafe.Sizeof(b))
}
   

文字列型

文字列は、固定長文字と連結された文字のシーケンスです。Goの文字列は1バイトで接続されています。バイトはUTF-8エンコーディングを使用してUnicodeテキストを識別します。
デフォルト値: ""
サンプルコード

func test03(){
    
    
	var str string = "北京欢迎你1"
	//str ="haha "
	fmt.Println(str[0])//229
	//str[0] = 1  报错 字符串内容无法修改
	//str的类型 string 占用的字节数是 16
	fmt.Printf("str的类型 %T 占用的字节数是 %d",str , unsafe.Sizeof(str))
	var str2 string =`adasdfa\n \t`
	var str3 string ="adasdfa\n \t"
	
	fmt.Println(str2)//输出 16adasdfa\n \t  不会通过 \转义字符
	fmt.Println(str3)//输出 16adasdfa

	str = str + "123"
	fmt.Println(str)

	str += "haha"
	fmt.Println(str)
	//当一个字符串很长时,可以通过加号分行写 但是加号要写在上一行
	var str5 = "haha" +
	"hah123" + " test "+
	"asdfas"
	fmt.Println(str5)
}

注意点

  1. 値が割り当てられた後は、文字列の内容を変更できません(1つのバイトの内容)
  2. 2つの文字列定義メソッド "123 \ n" 123\n(文字はエスケープされません)

基本的なデータ型変換

変数タイプの自動変換はGolangではサポートされておらず、
基本構文を明示的に変換する必要があります式T(v)は値vをタイプTに変換します。

サンプルコード

func test04(){
    
    
	var i int32 = 100
	var f float32 = float32(i)
	fmt.Println(f)//100
	//i的类型 int32 占用的字节数是 4
	fmt.Printf("i的类型 %T 占用的字节数是 %d",i , unsafe.Sizeof(i))

	var n1 int32 = 10
	var n2 int64

	//n2 = n1 +10 会报错 因为类型不符
	n2 = int64(n1)+10
	fmt.Println("n2 = ",n2)//20
	var n4 = 200
	var n3 int8 =10
	n3 = int8(n4)+10
	fmt.Println("n3 = ",n3)//-46 由于类型范围问题 导致计算结果不准

	//--------------基本类型 转string
	var i1 int =99
	var f1 float32 =32.23
	var b bool = true
	var c1 byte = 'a'
	var str string
	str = fmt.Sprintf("%d",i1)
	fmt.Println("str = ",str)
	fmt.Printf("str的类型 %T 占用的字节数是 %d \n",str , unsafe.Sizeof(str))
	str = fmt.Sprintf("%f",f1)
	fmt.Println("str = ",str)
	fmt.Printf("str的类型 %T 占用的字节数是 %d \n",str , unsafe.Sizeof(str))
	str = fmt.Sprintf("%t",b)
	fmt.Println("str = ",str)
	fmt.Printf("str的类型 %T 占用的字节数是 %d \n",str , unsafe.Sizeof(str))
	str = fmt.Sprintf("%c",c1)
	fmt.Println("str = ",str)
	fmt.Printf("str的类型 %T 占用的字节数是 %d \n",str , unsafe.Sizeof(str))

	str = strconv.FormatInt(int64(i1),10)
	str = strconv.FormatBool(b)
	str = strconv.FormatFloat(float64(f1),'f',10,64)
	
	//-----------string转基本类型
	var ss string = "123"
	var ss2 string = "true"
	var ss3 string ="123.123"
	var in1,_ = strconv.ParseInt(ss,10,64)
	fmt.Println(in1)
	var bo,_ = strconv.ParseBool(ss2)
	fmt.Println(bo)
	var fl,_ = strconv.ParseFloat(ss3,64)
	fmt.Println(fl)
}

注意点

  1. 一般的な型を文字列
    に変換する2つの方法:fmt.Sprintf( "%t"、b)を
    呼び出すstrconv.FormatBool(b)を呼び出す
  2. 文字列を共通の型に変換するには、次のようなstrconvパッケージメソッドを直接使用します。strconv.ParseInt(ss、10,64)
  3. 文字列を基本型に変換するときは、文字列の形式が正しいことを確認してください。helloをint型に変換できない場合、他の型はfloatを0に、ブール値をfalseに似ています。

ポインタ型

基本データ型変数は、値型とも呼ばれる値を格納します。ポインタ変数はアドレスを格納し、このアドレスが指すスペースは値を格納します。

var ptr *int = &num  //表示用ptr 变量保存 num变量的值的地址

サンプルコード

func test4(){
    
    
	var i int = 10
	fmt.Println("i的地址=",&i)

	var ptr = &i
	fmt.Println("i的地址=",ptr)

	fmt.Println("ptr的地址=",&ptr)

	fmt.Println("ptr指针地址保存的值=",*ptr)

	//ptr的类型 *int 占用的字节数是 8 
	fmt.Printf("ptr的类型 %T 占用的字节数是 %d", ptr, unsafe.Sizeof(ptr))
}

注意点

  1. 次のように、アンパサンドを使用して変数アドレスを取得します。&numは、num変数の値が保存されるアドレスです。
  2. ポインタ型はメモリアドレスを表します。すべての値型(整数、浮動小数点、bool、文字列配列、構造を含む)の変数には、次の形式の対応するポインタ型があります。*変数型:* int * int8 * int32 * int64 * float32
  3. 次のように、*を使用してポインタ変数によって保存されたアドレスの値を取得します。* ptrアドレスに保存された値を指すポインタptrを取得します。

値型と参照型

値のタイプ:含む:整数、浮動小数点、ブール、文字列配列、構造変数アドレスは値を直接保存します。メモリは通常スタックに割り当てられます。メモリ図は次のとおりです。
ここに画像の説明を挿入

参照型:変数はアドレスを格納し、このアドレスに対応するスペースは実際の値を格納します。このアドレスを参照する変数がない場合、値は時間としてリサイクルされます。通常、スペースはヒープ領域に割り当てられます。メモリ図は次のとおりです。
ここに画像の説明を挿入

識別子と命名規則

識別子

さまざまな変数、メソッド、関数などの命名にGolangが使用する文字列は、識別子の
命名規則になります

  1. 大文字と小文字、0〜9および_で構成されます
  2. 番号を開始できません
  3. 大文字と小文字を厳密に区別
  4. スペースを含めることはできません
  5. 単一の下線「_」は、空の識別子と呼ばれるGoの特別な識別子です。これは、任意の識別子を表すことができ、プレースホルダーとしてのみ使用されます。変数またはメソッドは、この識別子を介して呼び出すことはできません(値が呼び出されることはありません)例:メソッドは複数の値を返し、一部の値は不要なときにその場所を占めるために使用できます。識別子としてではなく、プレースホルダーとしてのみ

命名規則

  1. パッケージ名をディレクトリと一致させ、短くて意味のあるパッケージ名を使用し、標準パッケージと競合しないようにします
  2. 可変関数などはキャメルケースの命名法を使用します
  3. Goでは、変数、関数、および定数名の最初の文字が大文字の場合、他のパッケージ(Javaのpublicと同等)からアクセスできることを意味します。それ以外の場合は、このパッケージでのみ使用できます(保護されたプライベートなどに相当)
  4. 予約済みのキーワードと事前定義された識別子を使用しないでください

予約キーワード

ここに画像の説明を挿入
事前定義された識別子
ここに画像の説明を挿入

おすすめ

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