私は、言語を見に行くとき、私は交換に基づいて、人のために適した、関心のポイントをいくつかまとめ
!!あなたはすぐに行くのコードを理解したい場合は、あなたが言語を習得するためのシステムをしたい場合は、あなたが見に行くことができますことを示唆している、見下ろすことができますhttps://www.jianshu.com/p/5ee783bbdcacを!!
まず、変数宣言
VAR変数名変数型の
VAR(
変数名変数タイプ
変数名変数型
変数名変数種別
)
指针: var 变量名 new(类型名)
数组: var 变量名 []类型名
结构体: 实例名 struct{
变量名 变量类型
}
第二に、変数の初期化
するvar AAA =コンパイラがあなたのAAA型推測します// 40 40
VARをdamageRateのfloat32 = 0.17 //通常の代入
AAA:= 40 //シンプルな言葉遣い、どのようなAAAの正式な定義,: =上を割り当ての等価物を定義し、
1.已定义过的变量不能用 := 进行赋值
2.:= 可以一次性定义多个变量并赋值
eg. conn, err := net.Dial("tcp", "127.0.0.1:8080")
conn2, err := net.Dial("tcp", "127.0.0.1:8080")
net.Dial 返回了两个值,分别赋值给了 conn和err。
(conn, err) 和 (conn2, err) , 这两组变量,只要每组有一个是新变量就可以通过,编译器不会报错
3.多变量赋值 func (p IntSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
这个例子就很直观了,多变量赋值从左到右依次赋值,并不care你是谁
4. 对函数定义有疑问的,看看下面几个例子应该就差不多了
type IntSlice []int
func (p IntSlice) Len() int { return len(p) }
func (p IntSlice) Less(i, j int) bool { return p[i] < p[j] }
func (p IntSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
作用范围不止在函数里面的放到前面括号里,作用范围只在函数里面的放到后面括号里
5.匿名变量 _,b := GetData() 不在乎这个变量是谁,用_占个位置就行
如果只需要前面的变量 a := GetData() 就行
第三に、文字列
STR:=「の行に文字列ノートをエスケープします。」
1.utf8编码
2.多行字符串输入
ch := ` 第一行
第二行
第三行
`
两边加的这个是反引号,键盘1旁边那个
第四に、文字
のuint8バイトはと等価である
のInt32、UTF-8文字の代表と同等のルーン。あなたは中国語、日本語、または他の複雑な文字を処理する必要がある場合、あなたはルーンの種類を使用する必要があります。
ファイブキャスト
VAR C =のfloat32にMath.PI
fmt.Println(INT(C))
别的转换方式 fmt.Printf("int32: 0x%x %d\n", c, c)
第六に、ポインタ
のvar A = 111
PTR:// A =&定義された
値:= * PTR //参照
1.有指针的交换函数就要借助中间变量,不能再像 【二、3 】 说明的那样直接赋值
2.创建指针的另一种方式 var ptr=new(int)
七つの変数はエスケープ
簡単な言葉を、この変数はもはや存在しませんが、あなたはまだ彼を使用し、その変数は、変数のエスケープです
package main
import "fmt"
// 声明空结构体测试结构体逃逸情况
type Data struct {
}
func dummy() *Data {
// 实例化c为Data类型
var c Data
//返回函数局部变量地址
return &c
}
func main() {
fmt.Println(dummy())
}
例えば、上記の例のCポインタは、元のCプログラムでは、そこにクロスボーダーの訪問でしたが、変数をエスケープするためにそこに行くしている、我々は、cのポインタを脱出することに成功し
、その後、整数、上記リターンC場合、変数のエスケープだけではなく、ポインタ型Cは、ヒープメモリに変数のエスケープです
八、CONST
非常に単純な
CONSTのAA 1 =
CONST(
AA = 1
BB = 2
)
例えば、アナログ列挙クラスCONSTを与える以下
type Weapon int
const (
Arrow Weapon = iota // 开始生成枚举值, 默认为0
Shuriken
SniperRifle
Rifle
Blower
)
// 输出所有枚举值
fmt.Println(Arrow, Shuriken, SniperRifle, Rifle, Blower)
// 使用枚举类型并赋初值
var weapon Weapon = Blower
fmt.Println(weapon)
const (
FlagNone = 1 << iota
FlagRed
FlagGreen
FlagBlue
)
fmt.Printf("%d %d %d\n", FlagRed, FlagGreen, FlagBlue)
fmt.Printf("%b %b %b\n", FlagRed, FlagGreen, FlagBlue)
上記の例は、2,4,8(0b1,0b10,0b100)である結果
上面例子引申出 type 定义:
go1.9 之前 type byte uint8
go1.9 之后 type byte=uint8
值得注意的是 重定义的类型必须是本地类型,import的包里面的类型不能起别名
IX 配列
VARチーム[3]文字列
チーム[0] = "ハンマー"
...
VARチーム= [...]文字列{ "ハンマー"、 "兵士"、 "お母さん"} //!!ここでは...それは、コンパイラは、配列のサイズを把握することができることを意味します
配列トラバーサル機能
var team [3]string
team[0] = "hammer"
team[1] = "soldier"
team[2] = "mum"
for k, v := range team {
fmt.Println(k, v)
}
Kは、値Vの配列の各要素のトラバーサルキー配列のインデックス値です。
この範囲は、全く接触が本当に高いかすかな頭、詳細な勧告できなくなりますhttps://www.jianshu.com/p/4205659ca419、単に通過する組み込み関数であります
テン、スライス
var highRiseBuilding [30]int
for i := 0; i < 30; i++ {
highRiseBuilding[i] = i + 1
}
// 区间
fmt.Println(highRiseBuilding[10:15])
// 中间到尾部的所有元素
fmt.Println(highRiseBuilding[20:])
// 开头到中间的所有元素
fmt.Println(highRiseBuilding[:2])
コードの結果
[11 12 13 14 15]
[21 22 23 24 25 26 27 28 29 30]
[1 2]
A = VAR [] {1,2,3}
Aの[:] //元のスライス1,2,3} {
[0:0]} // {
-
コンストラクタスライスを作ります
([] T、サイズ、作成キャップ)// デフォルトの缶サイズ、CAP
要素タイプスライス:T。
サイズ:要素数がこのタイプに割り当てられます。
キャップ:事前に割り当てられた要素の数は、この値が設定された後のサイズに影響を与え、事前にスペースを割り振ることしかでき、複数の流通空間に起因するパフォーマンスの問題を減少させません。 -
スライスに要素を追加する()を追加
team := []string{"Pig", "Flyingcake", "Chicken"}
car = append(car, team)
-
コピー():スライスコピー
refDataを:srcData //参照は=
コピー(のCopyData、srcdataは変換)//新しいスライス空間にデータをコピーする
コピー(のCopyData、srcData [4: 6])// 部分をコピー -
スライスの削除
11を、マップ・マッピング
scene := make(map[string]int)
scene["route"] = 66
scene["brazil"] = 4
scene["china"] = 960
for k, v := range scene {
fmt.Println(k, v)
}
- する([キータイプ]値型、キャップをマッピングする)、キータイプは、タイプを示す値ボンドタイプ、値型を表します。
- マップは、あなたが直接、新規を作ることができ、回復する必要がありません。
- sync.Map
同時アクセスマップsync.Mapを提供し、人々は彼自身の内部のメンテナンス、手動でコードロックを記述する必要はありません、次は具体的な実装である、ロックする必要が行きます
package main
import (
"fmt"
"sync"
)
func main() {
var scene sync.Map
// 将键值对保存到sync.Map
scene.Store("greece", 97)
scene.Store("london", 100)
scene.Store("egypt", 200)
// 从sync.Map中根据键取值
fmt.Println(scene.Load("london"))
// 根据键删除对应的键值对
scene.Delete("london")
// 遍历所有sync.Map中的键值对
scene.Range(func(k, v interface{}) bool {
fmt.Println("iterate:", k, v)
return true
})
}
十二、リスト
囲碁言語で、達成するために、コンテナ/リストパッケージを使用して、リストには、内部の原理は二重リンクされたリストを達成
l := list.New()
l.PushBack("fist")
l.PushFront(67)
l.InsertAfter("high", element)
l.InsertBefore("noon", element)
l.Remove(element) for i := l.Front(); i != nil; i = i.Next() {
fmt.Println(i.Value)
}