Golang入門 - 基本型と関数定義の記事

前の記事内の設定と出力については、我々は学習の次のステップを入力してください

はじめに:囲碁言語機能

静的、開発コンパイルおよびコンカレントガベージコレクションで、言語に入ってくる。ゴーGoogleの言語
のGo言語のスタイルは、C言語に似て、構文が大幅にC言語に基づいて最適化されており、削除など、不要な括弧内の式、およびだけ言ってのサイクルの方法のために、あなたはトラバーサル値を適応させることができ、キー、したがって、囲碁言語は非常に簡単に始めることです。
囲碁言語ゴルーチンよりも最も大きな特徴。ゴー言語。ゴルーチン同時並行で機能層の言語でゴルーチン同様のスレッドを実装しますが、ゴルーチンが自動的に移動言語ランタイムでスケジュールされますスレッドではないことができるため、囲碁言語はよく、非常同時ネットワークサービスの準備に適しています。

A、移動し、基本的な文法の使用

図1に示すように、整数型

Go对类型的长度有极大要求
长度类型:int8 int16 int32 int64
对应无符号类型:uint8 uint16 uint32 uint64

2、フロート

Go语言支持两种浮点整数:
float32:最大范围约为 3.4e38,可以使用常量定义:math.MaxFloat32
float64:最大范围约为 1.8e308,可以使用常量定义:math.MaxFloat64

3、ブール

布尔型数据只有true和false
Go语言中不允许将整型强制转换为布尔型,代码如下:
fmt.Println(int(n) * 2)
编译错误,输出如下:
cannot convert n (type bool) to type int
布尔型无法参与数值运算,也无法与其他类型进行转换

4、文字列

文字列型の場合は、二重引用符は、ライブ文字列型に比べて拡大され、それが非ASCII文字に配置することができます

str := "hello world"
ch  := "中文"

5、スライス

要素の同じタイプで行く言語セクションについて次は、(動的に割り当てられた領域であってもよい)、可変長配列であります

var arr[]类型    // 初始化的时候定义,后面追加上类型 如int string float等
例:var arr[]int

] [における数値指標を提供するアクセスするために使用してスライス内の要素は、「[]」は、そのような割り当ての対応する図形開始からデフォルト値はありません、スライスインデックスデフォルトのアクセスがゼロである対応する値の値を取得することができます0として定義され、次のコードが貼り付けられています

// 创建切片
item := make([]int, 3)	//创建一个容量为3的整型切片 ps:其实就是创建一个容量只能为3的切片,但是value都只能为int
item[0] = 0		//为切片元素赋值
item[1] = 1
item[2] = 2

fmt.Println(item)
输出:[0 1 2]

シーケンスへの割り当て

// 创建切片
item := make([]int, 10)	//创建一个容量为10的整型切片 ps:其实就是创建一个容量只能为10的切片,但是value都只能为int
item[7] = 77
item[8] = 88

fmt.Println(item)
输出:[0 0 0 0 0 0 0 77 88 0]  // 未定义的索引值则默认为0

我々はまた、追加(追記)をスライスすることができます

info := append(item, 99)

fmt.Println(item, info)
输出: [0 0 0 0 0 0 0 77 88 0 99]  // 在原来的基础上追加了99

あるいはカバー(コピー)

test := []int{1,2,3,4,5}
copy(info, test)

fmt.Println(info)
输出:[1 2 3 4 5 0 0 77 88 0 99]

文字列は、(先頭から文字列傍受機能、ビット番号1)スライスした方法に従うことができ

str := "hello world"
fmt.Println(str[6:])// 输出截取,这里注意的是截取只能截取字符串类型的,其他类型截不了
输出:world

これらは、いくつかのより多くのヒントが文法的機能はゴーを見て、公式文書に、利用可能である、単にいくつかの小さな例ですhttp://docscn.studygolang.com/doc/

第二に、変数

1、変数宣言

var a int//声明一个整型类型的变量,可以保存整数数值
var b string//声明一个字符串类型的变量
var c []float32//声明一个32位浮点切片类型的变量,浮点切片表示由多个浮点类型组成的数据结构
var d func() bool//声明一个返回值为布尔类型的函数变量,这种形式一般用于回调函数,即将函数以变量的形式保存下来,在需要的时候重新调用这个函数
var e struct{//声明一个结构体变量,拥有一个整型的x字段
    x int
}

標準定義します。varパラメータの種類

バッチステートメント

var (
a int 
b string
c []float32
d func() bool
e struct{
    x int
    }
)

初期化変数(標準フォーマット)

var 变量名 类型 = 表达式
例:小明考试考了100分
var score int = 100

初期化の変数(短い変数宣言)

score := 100
// 如果score已经被var初始化过,则这个时候会报错,例如以下
var score int = 90
score := 80
// error : no new variables on left side of :=
// 报错提示的原因是左边没有新的变量名出现,则不允许重新赋值

// ps:也可以支持多个变量一直赋值
info, score, x = 0, 1, 2

2、匿名の変数(変数名と使用する必要はありませんが、メモリ空間を削減することができません)

開発中に、時には、メソッドを呼び出すパラメータの一部が必要とされていないことがわかったが、受信廃棄物のメモリをピックアップしたくない、あなたは、「_」アンダースコアで置き換えることを使用することができます

func item() (int,int) {
    return 100, 200
}
a, _ := item()
fmt.Println(a)

输出:100

// 当然,我们也可以在赋值的时候这么做

_, score := 0, 80
fmt.Println(score)

输出:80

、まだ非常に強力であるメモリにメモリ不足を心配することは何も進みません、それは安全に使いやすことができます

第三に、機能

従来は定義された関数

func 方法名(参数列表) 返回值 {
    定义
}

例:

func item(a) int {
    return 100
}

図1に示すように、関数の値(閉鎖)

関数の値は、コードの単なる文字列、また、記録状態ではありません。囲碁使用の閉鎖(クロージャ)技術関数値、関数値ゴープログラマは、クロージャと呼ばれます。私たちは、クロージャの例を見て:

func f1(limit int) (func(v int) bool) {
    //编译器发现limit逃逸了,自动在堆上分配
    return func (v int) bool { return v > limit}
}
func main(){

    closure := f1(3)
    fmt.Printf("%v\n", closure(1)) //false
    fmt.Printf("%v\n", closure(3)) //false
    fmt.Printf("%v\n", closure(10)) //true
}

ps:程序执行流程

1、程序进入main后,发现调用了f1方法并带入了”3“,此时返回一个闭包
2、走到下面closure(1)时,程序发现有传入闭包值”1“
3、程序走进上面的方法内,此时limit = 3, 闭包内的v = 1
4、走到下面的逻辑判断中,引用闭包内的v,并且将v与limit做比较
5、最终得到结果,返回给下面的 fmt.Printf("%v\n", closure(1))进行输出
6、依次类推

可変パラメータの機能

すなわち、パラメータ値が固定され死んでいない変数パラメータは、機能fmt.Printfとして、例えば、無制限の数Nを有することができるが、唯一の最後のパラメータは可変パラメータに設定することができます

声明

func 函数名(变量名...类型) 返回值

例えば:

func getData(str string, vals... int) (num int) {
    for  _,v := range vals {
	num += v
    }
    num += len(str)
    return
}

func main(){
    fmt.Printf("%d\n", getData("abc", 1,2,3,4,5 )) 
}

输出:18


将传入的1,2,3,4,5 循环追加给num值,最后再加上str的长度 15 + 3 = 18
注意:在for后面一点要加上匿名函数,否则始终不会循环追加最后一个值,如去掉加起来则为13
getData第二个参数即最后一个参数则为可变参数

図2は、遅延機能が延期行われます

それは延期文が含まれている(例えば、リターン、パニックのような)関数は、スタックの呼び出しが宣言されて延期文のリリース前に、終了後:これらの記録のように時間のかかる機能は、一般的にリソースの解放に使用される、それは次のような特徴を持っています

  • 延期が宣言されると、パラメータをリアルタイムに解決されます
  • 逆の順番と宣言順
  • 戻り値は延期知ら読み取ることができます
//演示defer的函数可以访问返回值
func f2() (v int) {
    defer func (){ v++}()
    return 1 //执行这个时,把v置为1
}

//演示defer声明即解释
func f3(i int) (v int) {
    defer func(j int) {
	v+= j
    } (i) 		//此时函数i已被解析为10,后面修改i的值无影响
    v = 9		// v = 9
    i = i*2		// i = 20
    return
}

//演示defer的执行顺序,与声明顺序相反
func f4() {
    defer func() {fmt.Printf("first\n")} ()
    defer func() {fmt.Printf("second\n")} ()
}

func main(){
    fmt.Printf("%d\n", f2()) // 13
    fmt.Printf("%d\n", f3(10)) // 19
    f4() //second\nfirst\n

最终输出:
        2
        19
        second
        first

执行过程:
1、首先调用了f2,由于defer是在return执行后再去执行的,所以当return 1时,附加v++ 所以最终返回值为2
2、调用了f3并传入值为10,进入到f3方法中,v = 9,i = 20,走到defer,此时i已经被解析成了10,所以后面的相乘无影响
3、接着进入defer后,设定了j值,此时j = i = 10,v是后面新赋的值,也没有被解析,所以v+=j 则等于 v = 9+10 = 19,最后返回19
4、最后一步f4是返回的顺序是相反的,则验明了defer是在声明的倒序执行的

ps:一般典型的用来计算耗时,资源关闭等,相关操作可按照业务逻辑编写

Golang研究の記事が更新していきます、ありがとうございました

 

 

59元記事公開 ウォンの賞賛219 ビューに10万+を

おすすめ

転載: blog.csdn.net/qq_34284638/article/details/104898402