基本データ型を行きます

これは、最初の囲碁研究ノートで、主に学習の基本的なデータ型が要約​​されます。
私は、PHP言語の開発を使用していたので、ある程度の知識は、多くの場合、混乱行くよう命じおよびPHPが行くのを学習するプロセスで(2の基本データ型に限る)を比較したことがわかりました。
 
行きます
PHP
基本データ型
ブーリアン
デジタルタイプ:
  • 整数(int型、単位)
  • フロート(のfloat32、float64型)
  • その他:バイト(同様の単位8)、ルーン(のInt32似た)など
文字列型
派生タイプ:
  • ポインタ型(ポインタ)
  • 配列型(配列)
  • 構造タイプ(StructEntryTable)
  • パイプライン型(チャネル)
  • タイプの機能(ファンクション)
  • スライスタイプ(スライス)
  • インターフェイスタイプ(インターフェイス)
  • マップタイプ(マップ)
スカラ型の4種類:
  • ブール値(ブール値)
  • 整数(整数)
  • フロート(浮き、またダブル呼ばれます)
  • 文字列(文字列)
3つの化合物の種類:
  • アレイ(配列)
  • オブジェクト(物体)
  • 呼び出し可能(呼び出し可能)
特殊なタイプの二種類:
  • 資源(リソース)
  • NULL(なしタイプ)
コーディングバイト
  • UTF-8エンコーディングのデフォルトを使用して、バイト文字列
  • Unicode文字のサポート
  • 唯一の256がサポートする文字セット、明示的にコードの文字コードを指定する必要があり  、ヘッダ(「のContent-Type:テキスト/ HTML;のcharset = UTF-8」);  またはphp.iniのデフォルトの文字セットが提供され、変更  "= DEFAULT_CHARSETをUTF-8 " 
  • これは、Unicode文字をサポートしていません。
文字列の定義
  • 二重引用符(「」):二重引用符はエスケープ文字が置き換えられます
  • バッククォート( `):バッククォートネイティブ文字列(例:\ n)をエスケープは、次のように出力され、
  • 単一引用符(「」):一重引用符で囲まれた単一の文字、出力、%Cを、そうでなければ出力文字コード番号をフォーマットする必要があります
  • 二重引用符(「」):二重引用符を使用すると、変数を解決することができ、文字が置き換えられますエスケープ、変数は、二重引用符で囲まれようとしています
  • 単一引用符(「」):出力として、移動して、エスケープ文字のような抗引用符がエスケープされていません
文字列の長さ

 lenは()  :それぞれのUTF-8文字エンコーディングを取得長と文字の数に直接、代わりに。

このように  LEN(「こんにちは、世界」)  の結果は、12の代わりに8

 STRLEN()  :行くと   lenは()  によって占有されるバイト数を取得するために、文字列に似ています

 utf8.RuneCountInStringは()  :実際の長さの文字列を、上記取得します  utf8.RuneCountInString(「こんにちは、世界」)  結果は8です。

注:インポートする必要があり、「ユニコード/ UTF8」

次の2つの関数を使用することができ、実際に文字列の長さを取得します。
  •  mb_strlen()  :mbstring拡張モジュールをインストールします
  •  iconv_strlenは()  :整数であり、統計の文字列の文字数を返します。
文字列の連結
演算子+:
STR:= "こんにちは、" + 
"の世界"
  • 文字列プラス「+」ステッチの間。現在の行の末尾に入れてラップ、+は、次の行の先頭に置くことができない場合
  • 文字列は不変である、このスプライシングを使用して、各操作は、追加負担をGCに新しい、一時的な文字列を生成しますので、比較的パフォーマンスの低下
演算子:
$str = "hello, " . "world";
// 也可以写成:
$str = "hello, " . "world";
  • 字符串之间用句点 “.”拼接,换行对句点的位置没有要求
fmt.Sprintf():
fmt.Sprintf("%d:%s", 2018, "年")
  • 内部使用 []byte 实现,不会产生临时的字符串
  • 内部逻辑复杂,还用到了interface,性能一般
strings.Join()
strings.Join([]string{"hello", "world"}, ", ")
  • Join会先根据字符串数组的内容,计算出一个拼接之后的长度,然后申请对应大小的内存,一个一个字符串填入
  • 已有一个数组的情况下,这种拼接方式的效率很高,但如果没有,去构造这个数据的代价也不小。
bytes.Buffer——优先推荐
var buffer bytes.Buffer
buffer.WriteString("hello")
buffer.WriteString(", ")
buffer.WriteString("world")
 
fmt.Print(buffer.String())
  • 使用这种拼接方式,可以把字符串当成可变字符使用,对内存的增长也有优化
  • 如果能预估字符串的长度,还可以用 buffer.Grow() 接口来设置 capacity。
strings.Builder——推荐
var b1 strings.Builder
b1.WriteString("ABC")
b1.WriteString("DEF")
 
fmt.Print(b1.String())
  • 内部通过 slice 来保存和管理内容
  • 提供了 Grow() 来支持预定义容量,这样可以避免扩容而创建新的 slice
  • 非线程安全,性能上和 bytes.Buffer 相差无几
数组
声明数组
  • 数组元素必须类型唯一,要么都是字符串,要么都是数字类型。如果想让数组元素类型为任意类型,可以使用空接口interface{}作为类型,当使用值时必须先做一个类型判断。
  • 声明时需要确定长度,如果采用不定长数组的方式声明,在初始化时会自动确定好数组的长度。
① var arr [2]int //var 数组名称 [数组长度]数组元素类型
② var arr = [2]int{1,2} //var 数组名称 = [数组长度]数组元素类型{元素1,元素2,...}
③ var arr = [5]string{3: "ab", 4: "cd"} //指定索引位置
④ var arr = [...]int{1,2} //var 数组名称 = [...]数组元素类型{元素1,元素2,...},不定长数组声明方式
⑤ new():创建的是数组引针,eg.  var arr1 = new([5]int) 
  • 声明时不需要确定长度,且数组元素可以多类型混合
$arr  = ['a', 'b', 'c', 123];
 
如果是 Go,会报错:
# command-line-arguments
./arr.go:6:34: cannot use 123 (type int) as type string in array or slice literal
值传递和
引用传递
var arr1 = new([5]int)
arr := arr1
arr1[2] = 100
fmt.Println(arr1[2], arr[2])
 
var arr2 [5]int
newarr := arr2
arr2[2] = 100
fmt.Println(arr2[2], newarr[2])
程序输出:
100 100
100 0
new([5]int)创建的是数组指针,arr和arr1指向同一地址,故而修改arr1时arr同样也生效;
而newarr是由arr2值传递(拷贝),故而修改任何一个都不会改变另一个的值。
达到与左侧相同的效果,PHP 代码如下:
$arr1 = [5, 10, 0, 20, 25];
$arr = &$arr1; //引用传递
$newArr = $arr1; //值传递
$arr1[2] = 100;
echo $arr1[2], $arr[2];
echo $arr1[2], $newArr[2];
 
程序输出:
100 100
100 0
PHP中的引用传递使用 & 符号。
切片
定义
  • 切片是引用(对底层数组一个连续片段的引用),不需要占用额外的内存,比数组效率高
  • 一个切片未初始化前默认为nil,长度为0
  • 切片的长度可变,可以把切片看成一个长度可变的数组
PHP中没有切片这个概念,但是在数组函数中有个 array_slice() 函数,可以根据 offset 和 length 返回指定的数组中的一段序列。与 Go 的切片相似。
$input = array("a", "b", "c", "d", "e");
$output = array_slice($input, 0, 3);   // returns "a", "b", and "c"
声明
① 切分数组
var arr = [5]int{1,2,3,4,5} //数组
var s []type = arr[start:end:max] //切片(包含数组start到end-1之间的元素),end-start表示长度,max-start表示容量
② 初始化
var s = []int{2, 3, 5, 7, 11} //创建了一个长度为 5 的数组并且创建了一个相关切片。
③ 切片重组
var s []type = make([]type, len, cap) //len 是数组的长度也是切片的初始长度,cap是容量,可选参数
简写为slice := make([]type, len)
字典
定义
  • 一种元素对的无序集合,一组称为元素value,另一组为唯一键索引key
  • 未初始化 map 的值为 nil。map 是引用类型
  • map 可以动态增长,声明时不需要定义长度
PHP的关联数组类似于 Go 的 Map。
声明
var mapName map[keyType]valueType
② var mapName map[keyType]valueType{k1:v1, k2:v2, ...}
var mapName = make(map[keyType]valueType, cap) //cap是可选参数,表示容量
其实 Go 的基本数据类型的知识点以及它和 PHP 的区别绝不止上面列出的这些,对比新旧两种语言的差别意义也不是很大,但对我来说,通过梳理可以达到温故知新的目的。 

おすすめ

転載: www.cnblogs.com/sunshineliulu/p/11616495.html