2017-08-23 3 views
-1

私はGo言語に新しく、GOでいくつかの例を試していました。
GO intはキーワードではありませんので、名前がintの変数を宣言しました。私はこのコードをビルドするときintデータタイプGo

package main 
import "fmt" 

func main() { 
    var int int = 8 
    fmt.Println(int) 

    var number int = 10 
    fmt.Println(number) 
} 

は今、私はエラーを次取得:

[[email protected] test]$ go build variables.go 
# command-line-arguments 
./variables.go:8: int is not a type 

私はこれを見ている理由を理解するために、何var int intがintが使用できないデータ型になるようにしたんだしようとしています。

+1

あなたはあなたの質問に対する答えを出しました:あなたは 'int'を何か違うものにしました(これはキーワードではありません)、今は違うものです。 – Volker

+0

はい! intの動作が変更されたようです。ここで私は "int object"を上書きしていました。次の行ではint型に別の変数を設定しています。 –

+0

@Adrian:それはあらかじめ宣言された数値型ですが、AFAIKでは 'int:= struct {}'のようなことができます。悲しいが本当。 OPが受け入れるべきことは、ほとんどの言語が悪いことをすることを許していることです。あなたがそうしないことはあなた次第です。それは未定義の動作を呼び出す/依存する、悪いCを書くことのようなものです。それは可能ですが、あなたがしなければならないことではありません –

答えて

0

Go intは事前定義された識別子なので、変数名として使用することはできません。したがって、最初の変数の名前を他のものに変更してください。 num1などのようにコンパイルされます!

package main 
import "fmt" 

func main() { 
    var num1 int = 8 
    fmt.Println(num1) 

    var number int = 10 
    fmt.Println(number) 
} 

+0

最後の2行を削除しても、それはまだコンパイルされます。だからなぜこれが起こるのか分からなかった。変数名としてintを受け入れますが、データ型intの動作を変更します。 –

+0

@bhagyeshdudhediyaうーん、それは大丈夫だよ。私は、他のintがインスタンス化されていないので、コードを解釈する他の方法はないとコンパイラが判断したと仮定します。 (他のint変数がない場合、唯一の可能性はintと呼ばれるintを作成したいということです) –

+1

@Deancoakley:ALERT: "Goでは、変数名として予約語intを使用できません。違います。 'int'は[既定の識別子](https://golang.org/ref/spec#Predeclared_identifiers)です。'int'は予約済みの[キーワード](https://golang.org/ref/spec#Keywords)ではありません。 – peterSO

3
package main 

import "fmt" 

func main() { 
    // int is a predeclared type identifier 
    var int int = 8 
    // int is a variable identifier 
    fmt.Println(int) 

    // error: int is not a type 
    var number int = 10 
    fmt.Println(number) 
} 

あなたはintという識別子をシャドーイングしています。

The Go Programming Language Specificationを参照してください。

Goがブロック構造化プログラミング言語です:

Blocks

Declarations and scope

intpredeclared identifierあると暗黙的に宇宙のブロックで宣言されています。

関数内で宣言された変数識別子のスコープは、宣言の最後で始まり、最も内側にあるブロックの終わりで終了します。

声明

var int int = 8 

は、事前に宣言された識別子をシャドーイング、変数識別子intを宣言するために、事前に宣言intタイプを使用しています:Variable shadowing