日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Golang——变量和常量详解

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Golang——变量和常量详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

變量:

變量是在程序運行過程中,其值可以發生改變的量,是數據的存儲空間,作為靜態類型語言,Go變量有固定的數據類型,類型決定了變量內存的長度和存儲格式。我們只能修改變量值,無法改變類型。

變量名:

因為內存分配發生在運行期,所以在編碼階段我們用一個易于閱讀的名字來表示這段內存,稱為變量名。 實際上編譯后的機器碼從不使用變量名,而是通過內存地址來訪問目標數據。

變量語法的注意事項:

  • 變量語句等號右邊的變量代表指向的內存空間,代表寫的操作
  • 變量語句等號左邊的變量代表變量內存空間存儲的數據值,代表讀的操作
  • 變量的首字母大寫才可以被其它的類、方法使用
  • 在go里局部變量定義后就要使用,否則編譯器報錯

變量的定義:

關鍵字var用于定義變量,數據類型被放在變量名后。另外,運行時內存分配操作會確保變量自動初始化為二進制零值(zero value),避免出現不可預測行為。如果是顯式初始化變量,可省略變量類型,由編譯器推斷。

x int // 定義x 沒初始化 默認值0y = 1 // 定義y 有初始化 數據類型intvar z bool // 定義z 沒初始化 默認值為false

可以一次性定義多個變量:

var x, y int // 多個變量相同數據類型var n, m = 100, "呵呵" // 多個變量不同數據類型

多個變量以組的方式定義:

var (x, y intn, m = 100, "呵呵")

自動推導類型:

在給變量賦值時,可以簡化書寫,使用:代替var即可,會自動檢測是什么類型。
自動推導類型的弊端:

  • 定義變量同時要初始化
  • 不能自定義數據類型
  • 自動推導類型創建的變量是局部變量
num := 1x, y, z := 1, 2, "嘻嘻"fmt.Println(num, x, y, z)

自動推導類型不一定是重新定義變量,也可能是重新賦值操作

func test() {x := 100println(&x)x, y := 200, "abc" //注意,x為賦值操作 僅有y是新變量定義println(&x, x)println(y) }

打印結果:

0x14000096f60 0x14000096f60 200 abc

自動推導類型定義的不是全局變量,是局部變量

var num = 100func test() {fmt.Println(&num,num)num := "我被重新賦值了,我和外面的num不一樣"fmt.Println(&num,num) }

打印結果:

0x1042b4288 100 0x14000110210 看看我是不是全局變量

定義變量必須是同一作用域內,且是新的變量

func test2() {x := 1 // 0x14000120008fmt.Println(&x)x := 2 // 報錯:等號左邊不是新的變量{x := 3 // 不同作用域都是新的變量fmt.Println(&x) // 0x1400001a098} }

在處理函數錯誤返回值時,自動推導類型允許我們重復使用err變量

func test5() {f, err := os.Open("/Users/itzhuzhu/Desktop/goCode/go_basics")if err != nil {fmt.Println("os.Open err:", err)return}fmt.Println(&err)buf := make([]byte, 1024)n, err := f.Read(buf)if err != nil {fmt.Println("os.Open err:", err)return}fmt.Println(n)fmt.Println(&err) }

打印結果:

0x14000110210 26 0x14000110210
多變量賦值:

在進行多變量賦值操作時,首先計算出所有右值,然后依次完成賦值操作,但必須保證左右值的數據類型相同

func test6() {x, y := 1, 2 // x:1 y:2x, y = y+3, x+2 // 先計算出右值y+3、x+2,然后再對x、y變量賦值。fmt.Println(y) }
局部變量&全局變量:
  • 定義函數內部的變量稱為局部變量,局部變量的作用域在函數的內部
  • 定義函數外部的變量稱為全局變量,全局變量的是任何函數都可以使用
  • 如果全局變量和局部變量的名字相同,在函數內局部變量的優先級大于全局變量,采用就近原則
var a = 3 var b int = 2 var c := 5 // 自動推導類型不能被函數使用,只能通過varfunc variate() {var d = 4fmt.Println(a, b, d) }
命名規則:

優先選用有實際含義,易于閱讀和理解的字母、單詞或組合對變量、常量、函數、 自定義類型進行命名。

  • 以字母或下劃線開始,由多個字母、數字和下劃線組合而成,區分大小寫
  • 使用駝峰式命名,名字首字母大小寫決定了其作用域,首字母大寫為導出成員,可被包外部引用,而小寫則僅能在包內使用。這一點類似于Java的修飾符public和private
  • 局部變量優先使用短命名
  • 專有名詞通常會全部大寫,例如escapeHTML
var c int // c代替countfor i := 0; i < 10; i++ { // i代替indexc++}fmt.Println(c)
忽略占位符:

Go有個名為的特殊成員(Black Identifier)。通常作為忽略占位符使用,可作表達式左值,無法讀取其內容。使用_表示

空標識符可用來臨時規避編譯器對未使用變量和導入包的錯誤檢查,但它是預置成員,不能重新定義

import ("fmt"_"os" // 對于還沒用到且不想刪除的可以加上占位符,避免編譯報錯 ) _, err = conn.Write([]byte(fileName)) // _:表示忽略占位符if err != nil {fmt.Println("conn.Write err:", err)return }

常量:

常量是在程序運行過程中,其值不可以發生改變的量。常量的定義是通過const關鍵字完成的,并且常量名稱要大寫
常量值必須是編譯期可確定的字符、字符串、數字或布爾值。可指定常量類型或由編譯 器通過初始化值推斷

// 當常量比較多的時候可以使用常量塊來表示,比較簡潔 const (USERNAME = "itzhuzhu"AGE = 24ADDRESS = "廣州" )// 也可以多重賦值 const GENDER, HOBBY = "男", "黑絲"func main() {const USERNAME string = "itzhuzhu2"fmt.Println(USERNAME, AGE, ADDRESS) // 就近原則打印的是itzhuzhu2 }

定義常量不使用不會編譯錯誤,不同作用域也可以定義相同常量

func test8() {const x = 123fmt.Println("我是外面的:", x)const y = 1.23 // 未使用不會引發編譯錯誤{const x = 321 // 不同作用域定義同名變量fmt.Println("我是里面的:", x)} }

如果顯式指定數據類型,必須確保常量左右值類型一致,需要時可做顯式轉換。右值不能超出常量類型取值范圍,否則會引發溢出錯誤

func test09() {const (x, y int = 99, -999b = byte(x) // 如果x沒有顯式類型定義,那么無需轉換n = uint8(y) // 報錯:無法將類型 'int' 的表達式轉換為類型 'uint8') }

常量值也可以是某些編譯器能直接計算結果的表達式,如unsafe.Sizeof、len、cap等

func test10() {const (ptrSize = unsafe.Sizeof(uintptr(0))strSize = len("hello, world!"))fmt.Println(ptrSize)fmt.Println(strSize) }

在常量組中如不指定類型和初始化值,則與上一行非空常量右值(或表達式文本)相同。

func test11() {const (x uint16 = 120y // 與上一行x類型、右值相同s = "abc"z // 與s類型、右值相同)fmt.Printf("%T, %v\n", y, y) // 輸出類型和值fmt.Printf("%T, %v\n", z, z) }

打印結果:

uint16, 120 string, abc

顯示常量和隱式定義常量區別:

const x = 100 // 隱式無常量類型 const y byte = x // 相當于const y byte = 100 const a int = 100 // 顯式指定常量類型,編譯器會做強類型検查 const b byte = a // 錯誤:cannot use a (type int) as type byte in const initializer

變量和常量的區別:

常量除不可以再次賦值外,和變量究竟有什么不同?

常量不會分配存儲空間,無需像變量那樣通過內存尋址來取值,因此無法獲取地址。
常量值不能再次改變,變量可以

var x = 0x100const y = 0x200func main() {println(&x, x)println(&y, y) // 報錯: cannot take the address of y }

關鍵字:

Go中有25個關鍵字,雖不是主流語言中最少的,但也體現了Go語法規則的簡潔性。關鍵字不能用作常量、變量、有數名以及結構字段等標識符。

breakdefaultfuncinterfaceselect
casedefergomapstruct
chanelsegotopackageswitch
constfallthroughifrangetype
continueforimportreturnvar

初始化:

對復合類型(array、slice、struct、map)變量初始化時,有一些語法限制

  • 初始化表達式必須有類型標簽
  • 左大括號必須在類型尾部,不能另起一行
  • 多個成員初始值以逗號分隔
  • 允許多行,但每行必須以逗號或右大括號結束
func main () {d := data{ // 語法錯誤:unexpected semicolon or newline (左大括號不能另起一行)1,"abc",}d := data{1,"abc" // //語法錯誤:need trailing comma before newline (須以逗號或右大括號結束)} }

總結

以上是生活随笔為你收集整理的Golang——变量和常量详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。