行く語学自習ノート(B)

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/qq_18800771/article/details/96829398

言語関数を移動します:

関数定義の形式:

func fun(/*参数列表*/)(/*返回值列表*/){
    //函数体
    //返回语句
}

引数ない関数の定義と呼び出しの戻り値なし:

package	main
import "fmt"
func fun(){		
	fmt.Println("函数运行")	
}		
func main(){
	fun()
}

それに注意してください。

1.プログラムが入口から実行され、関数が呼び出されるために定義されている必要があり、あなたは、main関数内の関数を呼び出す必要があります:関数名()

2.カスタム関数主な機能の前と後の違いはありませんが、関数が定義されているが、エラーなしで呼び出されていません。

3.関数名ケース差がないため、個々のプログラムのソースコード

何のパラメータは、関数と呼び出しの戻り値を定義していないがあります。一般的な引数リストは、

func fun(a int){
	fmt.Println("函数参数",a)
}
func main(){
	fun(100)
}

それに注意してください。

1.関数名で定義されたパラメータ定義された関数は、()パラメータと呼ばれます。

2.同じ名前が繰り返し定義されて/機能することができない、とキーワードパラメータ定義を要求してはならない、in vivoでのパラメータリスト関数で定義することはできません。同時に、割り当てパラメータは、体内でのみ機能することができ、それ以外の場合はエラーになり、パラメータリストに入れることはできません。

関数が呼び出されると、関数名(必要なパラメータ)、必要なパラメータは、関数呼び出しを渡す引数3と呼ばれています。

4.パラメータがパラメータではなく、逆転写(一方向送信)への引数によってのみ渡されます。

あって、関数呼び出しの複数のパラメータの定義:

func fun(a int,b int){        //参数类型相同可以简写为(a,b int)
	fmt.Println("函数参数",a,b)
}
func main(){
	fun(100,200)
}

なお:パラメータリストは、我々はいくつかのパラメータを渡す必要があるときに呼び出すには、いくつかのパラメータがあり、それ以外の場合はエラーになります:十分ではないパラメータがコールします。

変数パラメータリスト:関数の定義と呼び出しは、戻り値のないパラメータを持っています

func fun(args ...int){
	fmt.Println("函数参数",args)
}
func main(){
	fun(100,200,300)
}

それに注意してください。

可変パラメータの1種類:... int型変数のパラメータ型(...タイプ)と呼ばれるこのタイプのように。

2引数は0-nは、複数の送信されても​​よいです

3.不定パラメータlenの組み込み関数(引数)ユーザのパラメータが渡されたの数を読み取ることができます。

使用不確実なパラメータ:

リサイクルのために:生体機能に変数パラメータリストの機能を使用して

for i:=0;i<len(args);i++{
	fmt.Printf("参数%d的内容为%d\n",i,args[i])
}

イテレーションは使用しています:生体内での機能を使用して、変数パラメータリストの機能に

for i,data:=range args{
	fmt.Printf("参数%d的内容为%d\n",i,data)
}

それに注意してください。

1.不確実なパラメータが最後のパラメータパラメータ、それ以外の場合はエラーに配置する必要があります。

func fun(a int,args ...int){}

2.固定パラメータは、必要に応じて必要に応じて、可変パラメータ送信パラメータを渡すパラメータです。

可変パラメータを渡す:私たちは別の関数内の関数に渡された不確実なパラメータをすることができ

func myfunc (tmp ...int){	
}
func test(args ...int){
	myfunc(args...)    //全部元素传递给myfunc
	myfunc(args[:2]...)    //args[2]前(不包括)进行传递
	myfunc(args[2:]...)    //args[2]后(包括)进行传递
}
func main(){
    test(1,2,3,4)
}

関数の戻り値で定義されたパラメータはありません。

単一の戻り値は、書き込みのさまざまなを持っています:

言葉遣い:

func myfunc() int {		
	return 100
}

それに注意してください。

あなたは括弧を省略し、のみ戻り値の変数名1.を宣言することはできません。

2.関数は、割り込み関数を返すために必要な値を返し、対応する量を返します。

2著:

func myfunc() (result int) {
	return 100
}

我々はまた、変数名とコードの最適化の戻り値として再生することができます。この時点では、次のとおりです。共通の側

func myfunc() (result int) {
	result=100
	return 
}

この方法は、メインをクリアするための推奨文言ゴーの言語で戻り値、にちなんで命名されました。

注意:戻り値は、リスト全体を返し、復帰後の内容を記述しないでください。

引数なしの関数呼び出しの戻り値はありません。

func main(){
	var a int
	a=myfunc()    //赋值接受返回值
	b:=myfunc()    //自动推导接受返回值
}

複数の戻り値を返すために、パラメータなしで関数を宣言:行く言語は一意である、他の言語と異なる単一の値の制限を返します。

伝統的な執筆:

func myfunc() (int,int,int) {
	return 1,2,3
}

言語推奨文言を行きます:

func myfunc() (a int,b int,c int) {	//也可以写为(a,b,c int)
	a,b,c=1,2,3		//多重赋值
	return 
}

何のパラメータは、呼び出し元の関数複数の戻り値を返しません。

func main(){
    a,b,c:=myfunc()
    fmt.Printf("第一个参数:%d\n第二个参数:%d\n第三个参数:%d\n",a,b,c)
}

この時点で、戻り値の出力、出力形式は明確に便利推奨されている場合

パラメータの値を返し、関数宣言を呼び出すもあります。数の最大値を選択する2つのケースは

func maxandmin(a,b int)(max,min int){
	if a>b{
		max=a 
		min=b 
	}else{
		max=b 
		min=a 
	}
	return 
}
func main(){
	max,min:=maxandmin(10,20)
}

私たちは一人で最大値または最小値を受信したい場合は、この時点で、あなたはまた、デフォルトの戻り値に匿名変数を使用することができます。

max,_:=maxandmin(10,20)

通常の関数コールフロー:ネストされたコールのセット - 最初の呼び出しが戻った後、最後のアウト

package main
import "fmt"
func fun2(x int) (a int) {
	a=x+1
	fmt.Println("函数2运行,当前a的值是", a)
	fmt.Println("函数2运行结束,当前a的值是", a)
	return
}
func fun1(x int) (a int) {
	a=x+1
	fmt.Println("函数1运行,当前a的值是", a)
	a = fun2(a)
	fmt.Println("函数1运行结束,当前a的值是", a)
	return
}
func main() {
	a := 0
	fmt.Println("主函数运行,当前a的值是", a)
	a = fun1(a)
	fmt.Println("主函数运行结束,当前a的值是", a)
}

結果:

主函数运行,当前a的值是 0
函数1运行,当前a的值是 1
函数2运行,当前a的值是 2
函数2运行结束,当前a的值是 2
函数1运行结束,当前a的值是 2
主函数运行结束,当前a的值是 2

彼らは同様の機能を実行するために、各機能を見つけた場合、この時点で、我々は、再帰関数呼び出しを書き換えるために、この機能を使用する:関数が自分自身を呼び出します。

package main
import "fmt"
func test(a int) {
	if a == 2 {
		fmt.Printf("递归a=%d\n", a)
		return //终止函数,否则将无限递归
	}
	fmt.Printf("递归a=%d开始\n", a)
	test(a + 1)
	fmt.Printf("递归%d结束\n", a)
}
func main() {
	a := 0
	test(a)
}

結果:

递归a=0开始
递归a=1开始
递归a=2
递归1结束
递归0结束

再帰関数の応用:累積デジタル実装(1-100)

伝統的な方法:ループ機能のためのパッケージ:

func test01() (sum int) {
	for i := 1; i <= 100; i++ {
		sum += i
	}
	return
}
func main() {
	sum := test01()
	fmt.Println(sum)
}

再帰的な方法:

累積リバース:

func test02(i int) int {
	if i == 1 {
		return 1
	}
	return i + test02(i-1)
}
func main() {
	sum := test02(100)
	fmt.Println(sum)
}

累積正のシーケンス:

func test03(i int) int {
	if i == 100 {
		return i
	}
	return i + test03(i+1)
}
func main() {
	sum := test03(1)
	fmt.Println(sum)
}

言語関数の種類を行きます:

伝統的な方法は、関数を呼び出す:関数名(パラメータリスト)

func Add(a,b int ) int {
	return a+b
}
func minus(a,b int) int{
	return a-b
}
func main(){
    result:=Add(1,1)
}

また、関数型から関数にタイプすることで、データ型の関数として名前を見て、同じ要件および機能パラメータリストを持っており、戻り値は、関数型変数で割り当てることができますすることができます。

type FuncType func(int,int)int    //没有函数名字以及大括号,FuncType是一种自定义函数类型

関数型変数の定義と代入:

func main(){
    var fTest FuncType    //声明一个函数类型变量fTest
    fTest = Add    //将函数入口赋值给变量
    result:=fTest(1,1)    //等价于result:=Add(1,1)
}

なお:関数名は、関数のエントリアドレス、関数ポインタ型、C言語と同様の機能です

主に多型の思考:コールバック - 関数のパラメータは、タイプの関数であり、

計算機能は、4つの操作を実現しました。

func Calc(a,b int, fTest FuncType) (result int){
	result=fTest(a,b)		//函数没有实现
	return 
}

特定の機能が実現しなかったFTESTこの時点で、なお注意してください。この計算機能のために、前のフレーム、およびその後の機能を実現します。同じインタフェースを呼び出し、様々な形態を呼び出す、あなたは異なる機能を実現することができます - 4つの操作を:それは多型を反映しています。

計算関数が呼び出されます。

func main(){
    result:=Calc(1,1,Add)
}

ここではPythonに似た辞書やスイッチコール機能を使用します

この方法の利点は:

最初の呼び出しの定義と実装せずに、この機能は、スペースを確保するために呼び出すことができ、すぐに開発するより多くのスペースを機能するように、関数パラメータの受け渡しを実装する必要はありません、より多くの機能の機能を使用するためにユニークな利点を持っています。伝統的な書き込みはポリモーフィズムを実現する方法、即時の機能を達成する必要はありません。

匿名関数とクロージャ:なし関数名は、外部変数をキャプチャすることができます。

匿名関数定義:

定義して、手動で呼び出します。

func main(){
    f1:=func(){		//自动推导类型,较为常用
        fmt.Println("匿名函数")
    }
    f1()
}

エイリアス関数呼び出し:このメソッドは使用されません

type FuncType func()
var f2 FuncType
f2=f1
f2()

無名関数を定義し、自動的に呼び出します。

func(){
    fmt.Println("匿名函数")
}()		//此()代表自动调用此匿名函数--传递参数括号

匿名マニュアル機能はパラメータで呼び出します。

f3:=func(i,j int){
    fmt.Println("匿名函数参数:",i,j)
}
f3(10,20)

パラメータを持つ匿名関数が自動的に呼び出します。

func(i,j int){
    fmt.Println("匿名函数参数:",i,j)
}(10,20)

パラメータと戻り値を持つ匿名関数が自動的に呼び出します。

x,y:=func(i,j int)(max,min int){
    //函数体,将参数最大值赋给max,参数最小值赋给min。详细代码省略
    return
}(10,20)

外部変数の閉鎖捕捉特性:変数は、クロージャ内部の外側に捕捉され、また、外部の改質効果を変数の値を変更することができます

func main(){
    a:=10
    func(){
	    a=11
	    fmt.Println(a)
    }()
    fmt.Println(a)
}

閉鎖参照キャプチャ外部変数:

正常な機能:

func test01 () int{
	var x int
	x++
	return x*x
}

この関数の各呼び出しが主な機能である、返される結果は1:各呼び出し、同じ結果。xは、この関数は0に呼び出され、初期化されるだけの領域を割り当てているため、関数呼び出しは自動的に解除Xを終了しました。

聞かせている場合、関数の戻り値は、関数の型を返す無名関数は次のとおりです。クロージャ

func test02() func() int{
	var x int
	return func() int{
		x++
		return x*x
	}
}
func mian(){
    f:=test02()
}

この場合、関数の戻り値は、匿名関数である関数型、匿名関数はFによって返される呼び出しに戻り - 閉鎖機能。

この機能は、1,4,9,16異なる結果が返され、各時間関数と呼ばれる....

我々はそれを結論付けることができます:閉鎖は限り閉鎖がまだこれらの量を使用しているとして、彼らは存在し続けるとリセットするために解放されません、変数や定数のキャプチャが範囲を超えて気にしません。すなわち:袋閉じた変数のライフサイクルは、彼の範囲によって決定されていません。

キーワードは延期呼び出し遅らせるために:内部でのみ機能に、あなたはオンとオフのいくつかのクリーンアップアクションを行うことができ、メイン関数の最後まで実行されます。

func main(){
	defer fmt.Println("打印语句2")
	fmt.Println("打印语句1")
}

このとき、出力は次のようになります。

打印语句1
打印语句2

複数の一般的なアクションを延期する場合:最初の文の実行を延期しません、最初の書き込みの後、プレスの実施を延期することを呼び出します。エラーの真ん中のような関数は、割り込みの実行を延期することはつながりません。

匿名関数と組み合わせを延期します:

defer func(a,b int){
    fmt.Println("匿名函数参数:",a,b)
}(100,200)

なお:この機能は、オーダーパラメータが渡された場合、パラメータを渡すことは、プログラム全体のシーケンシャル構造に影響されないが、唯一、このような機能は、main関数の終了前に呼び出されますました。

コマンドライン引数言語は行くを取得します:

package main
import "os"
func main(){
    list:=os.Args
}

このとき、ユーザの数は、組み込み関数の入力パラメータを介して取得してもよいです。

n:=len(list)

また、パラメータとみなすことができ、ユーザーのパラメータは文字列を受け入れるように渡されるacceptコマンドを実行する:しかし、それはと指摘します。

我々はまた、次の方法ですることができ、ユーザのパラメータを取得したい場合は、同じ時:

ループのための方法:

for  i:=0;i<n;i++{
    fmt.Printf("用户第%d个参数:%d\n",i,list[i])
}

反復法:

for i,data:=range list{
    fmt.Printf("用户第%d个参数:%d\n",i,data)
}

言語変数のルールを移動します:

ローカル変数:{}で定義されるか、またはそのような他のためのブレース又は特定のブロックでのみ有効なローカル変数(スコープのスコープ、可変)、ある場合などの文のブロックに属しています。ローカル変数を定義するための実行が自動的に解除スコープの外に、スペースを割り当てられています。

グローバル変数:外側の関数で定義された変数はグローバル変数では、プログラム内のどこでも使用することができます。

次の規則がときに、グローバル変数と同じ名前のローカル変数適用されます:あなたは、同じ名前の異なるスコープ変数を定義することができますが、使用する変数は、近接、変数が最も近い変数である文の中で使用される変数の変数スコープの原理を取ります。

言語ワークスペースを移動します:

1.Go言語コードは、作業領域に配置しなければならない、またはパッケージをインポートすることはできません。

2.パッケージには、メンテナンスや呼び出しコードをより助長モジュラーを持っています。

3.ソースコードは、srcディレクトリに配置する必要があります。

4.パッケージが導入GOPATHから導入されます。

パッケージを導入する方法:

伝統的な方法:

import "fmt"
import "os"

一般的な言葉遣い:

import(
	"fmt"
	"os"
)

(ドット)操作:

import . "fmt"

パッケージ名を経由せずに、しかしによる個人的な習慣に、この方法で、呼び出し元の関数を使用すると、名前が重複する可能性があります。

エイリアス方法:

import io "fmt"

呼び出す関数はIOに変更することができ、この方法で、FMTを使用します。

バッグ法を無視:

import _ "fmt"

この方法は、パケットを導入するために使用されているが、機能は(持って後述する)パケットにパケットのみ盗難init関数では使用されません。

init関数の導入:初期化関数への初期化機能と同等

バッグ内に導入された場合、パッケージは、関数initが主機能を実行した後に再度実行されます。

init関数自体は、実行自体のinit、初期化パケットに導入され、最終的にはメイン実行されている場合。

言語プロジェクト管理を行きます:

プロジェクト管理の下で同じフォルダ:

1分..ファイル(複数のソースファイルを)プログラミング、プロジェクトディレクトリのsrcディレクトリ(自己書かれた)に配置する必要があります。

2.設定GOPATH環境変数。

コンピュータのプロパティ]> [システムの詳細設定>環境変数>システム変数は、プロジェクトフォルダ(ディレクトリプロジェクトのsrcディレクトリ)のsrcディレクトリ内に設置GOPATH

3.パッケージ名と同じディレクトリには同じ、1つのプログラムだけのエントリでなければなりません。

SRC内:main.go(パッケージメイン)test.go(パッケージメイン)

4.go ENV関連する環境のパスを見に行きます。

同じディレクトリ機能5.コールの他のファイルは、パッケージの名前を参照することなく、直接呼び出すことができます。

プロジェクト管理の下で異なるレベルのディレクトリフォルダ:

1.別のパッケージ別のディレクトリ名

SRC内:main.go(パッケージメイン)

src/cacl内: calc.go(package calc)

)(パッケージ名関数名導入パッケージ名をインポートする必要があります。2.パッケージ形式内部異なる関数を呼び出します

3.一時的な設定:カスタムプロジェクトのsrcディレクトリを設定するには、liteideコンパイラGOPATH

4.別のパッケージ関数を呼び出す場合は、関数名は小文字では、関数呼び出しが大文字にする必要があり、呼び出すことはできません。

:あなたは、複数のファイルまたは複数のパッケージを持っている場合

1.設定GOPATH環境変数、構成srcディレクトリの絶対パス---プロジェクトフォルダ。

2.自動的にビンやPKGを生成するには、コマンドをインストール行く使用する必要があります。

3.配置GOBIN

プロジェクトディレクトリに:

1.プロジェクトディレクトリ下のbinディレクトリに比べて、システム変数に変数の値をGOBINを作成します。

2.プロジェクトのsrcディレクトリの下にコマンドラインを使用してインストール移動し、自動的にビンのpkgを生成します。

SRC:ソースコードを保存します

ビン:実行可能ファイルを保存します

PKG:ストレージ・プラットフォーム依存ライブラリ

おすすめ

転載: blog.csdn.net/qq_18800771/article/details/96829398