老虞學GoLang筆記-變數聲明與初始化

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

變數聲明

官方DOC: http://golang.org//spec#Variable_declarations

Go中使用全新的關鍵字var來聲明變數。var我們並不陌生,在Javascript 和C#中均有出現。不同的是Go和C#中變數屬於強型別,在聲明變數後就不允許改變其資料類型。

聲明變數有多種形態:

  1. var a int //聲明一個int類型的變數

  2. var b struct { //聲明一個結構體

    name string

    }

  3. var a = 8 //聲明變數的同時賦值,編譯器自動推導其資料類型

  4. var a int = 8 //聲明變數的同時賦值

  5. var { //批量聲明變數,簡潔

    a int

    b string

    }

變數初始化

變數的初始化工作可以在聲明變數時進行初始化,也可以先聲明後初始化。此時var關鍵字不再是必須的。

初始設定變數有多種方式,每種方式有不同的使用情境:

  1. 在方法中聲明一個臨時變數並賦初值

    > var tmpStr = “”

    > var tmpStr string = “”

    > tmpStr :=””

  2. 全域中已聲明變數直接賦值

    > tmpStr = “<body>”

我們看到有此兩種方式:

  1. var name [type] = value

    如果不書寫 type ,則在編譯時間會根據value自動推導其類型。

  2. name := value

這裡省略了關鍵字var,我很喜歡這種方式(可以少寫代碼,而沒有任何壞處)。 但這有需要注意的是“ :=” 是在聲明和初始設定變數,因此該變數必須是第一次出現,如下初始化是錯誤的。但是要注意賦值時要確定你想要的類型,在Go中不支援隱式轉換的。如果是定義個float64類型的變數,請寫為 v1 :=8.0 而不是v1 :=8 。

var a int

a := 8

//我剛開始時老出現這種錯誤,一直將 “:= ” 當作 一般指派陳述式處理

思考問題

初始化語句,在編譯器上是如何進行自動類型推導的。一些字面常量是如何歸類的?

如 8 → int , 8.0 → float64

package main


import (

"fmt"

"reflect"

)


func main(){

var v1 int = 8

var v2 byte = 8

v3 := 8

v4 := 8.0

 

fmt.Printf("v1 type :%s\n",reflect.TypeOf(v1)) //int

fmt.Printf("v2 type :%s\n",reflect.TypeOf(v2)) //uint8

fmt.Printf("v3 type :%s\n",reflect.TypeOf(v3)) //int

fmt.Printf("v4 type :%s\n",reflect.TypeOf(v4)) //float64

}

 

官方文檔: http://golang.org/ref/spec#Constant_expressions

const a = 2 + 3.0 // a == 5.0 (untyped floating-point constant)const b = 15 / 4 // b == 3 (untyped integer constant)const c = 15 / 4.0 // c == 3.75 (untyped floating-point constant)const Θ float64 = 3/2 // Θ == 1.0 (type float64, 3/2 is integer division)const Π float64 = 3/2. // Π == 1.5 (type float64, 3/2. is float division)const d = 1 << 3.0 // d == 8 (untyped integer constant)const e = 1.0 << 3 // e == 8 (untyped integer constant)const f = int32(1) << 33 // f == 0 (type int32)const g = float64(2) >> 1 // illegal (float64(2) is a typed floating-point constant)const h = "foo" > "bar" // h == true (untyped boolean constant)const j = true // j == true (untyped boolean constant)const k = 'w' + 1 // k == 'x' (untyped rune constant)const l = "hi" // l == "hi" (untyped string constant)const m = string(k) // m == "x" (type string)const Σ = 1 - 0.707i // (untyped complex constant)const Δ = Σ + 2.0e-4 // (untyped complex constant)const Φ = iota*1i - 1/1i // (untyped complex constant)

const ic = complex(0, c) // ic == 3.75i (untyped complex constant)

const iΘ = complex(0, Θ) // iΘ == 1.5i (type complex128)

const Huge = 1 << 100

// Huge == 1267650600228229401496703205376 (untyped integer constant)

const Four int8 = Huge >> 98 // Four == 4 (type int8)

 

^1 // untyped integer constant, equal to -2

uint8(^1) // illegal: same as uint8(-2), -2 cannot be represented as a uint8^uint8(1) // typed uint8 constant, same as 0xFF ^ uint8(1) = uint8(0xFE)int8(^1) // same as int8(-2)^int8(1) // same as -1 ^ int8(1) = -2



------------------------2013-04-14補充----------------------------------------

func  main(){

 

        v1 :=8         v1 =8.0       // 編譯可通過,運行無錯誤         fmt.Println(v1) } 在C#中會編譯不通過,而Go語言中卻是可行的,這是為什麼呢?我在golang-chang中向大家請教了該問題,謝謝協助我的人。 https://groups.google.com/forum/?fromgroups=#!topic/golang-china/k1UOr_1K_yw 將結果整理給大家

1. Go裡面不損失精度的情況下會把8.0這類浮點數視作整數8
2. Go裡面的常數是高精度數,分為幾類:  1.有類型的:uint(8),類型顯式指定了,在運算式裡面不會變化。  2.無類型的:分成無類型整數和無類型浮點兩類。這兩類在使用的時候會根據上下文需要的類型轉化為實際類型,    比如uint8(0) + 1.0就是uint8(1),但是uint8(0)+1.2就會由於1.2無法轉化為uint8而報錯。    如果上下文無法確定(比如 i, j := 1, 2.0這樣的),那麼整數無類型常數轉化為int,浮點數無類型常數轉化為float64.具體規則參見:http://tip.golang.org/ref/spec#Constant_expressions

---------------------------------2013-04-14 end------------------------------------------------

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.