Go 語言內置類型全解析:從布爾到字元串的全維度探究

来源:https://www.cnblogs.com/xfuture/archive/2023/09/07/17684337.html
-Advertisement-
Play Games

> 關註微信公眾號【TechLeadCloud】,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智能實驗室成員,阿裡雲認證的資深架構師,項目管理專業人士,上億營收AI產品研發負責人。 > 本文深入探討了 Go 語言的內 ...


關註微信公眾號【TechLeadCloud】,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智能實驗室成員,阿裡雲認證的資深架構師,項目管理專業人士,上億營收AI產品研發負責人。

本文深入探討了 Go 語言的內置類型系統,從布爾類型到複雜的字元串類型,旨在為開發者提供全面而詳盡的指導,通過豐富的代碼示例和應用場景,揭示瞭如何在實際項目中高效地運用這些類型。

在編程中,類型(type)可以被看作是值(value)的模板,而值則可以被看作是類型的實例。在這篇文章里,我們專註於介紹Go語言的內置(或稱為預聲明的)基本類型和它們字面量的表示形式。這裡並不涉及組合類型。

file

一、布爾類型

定義

在 Go 語言中,布爾類型用關鍵字 bool 表示,它有兩個預定義的常量值:truefalse

var myBool bool = true

基礎用法

聲明與初始化

布爾變數可以在聲明時初始化,也可以稍後進行賦值。

// 聲明並初始化
var isReady bool = true

// 聲明後賦值
var isEnabled bool
isEnabled = false

邏輯運算

布爾類型主要用於邏輯運算:AND (&&), OR (||), 和 NOT (!)。

// AND 操作
result := true && false  // 輸出:false

// OR 操作
result = true || false  // 輸出:true

// NOT 操作
result = !true  // 輸出:false

進階用法

條件語句

布爾類型經常用於 if, else ifelse 結構中。

if isReady {
    fmt.Println("System is ready.")
} else {
    fmt.Println("System is not ready.")
}

迴圈結構

布爾表達式也可用於控制迴圈結構如 for

for isReady {
    // 執行代碼
}

函數返回值

布爾類型也經常用作函數的返回類型,以指示函數是否成功執行或驗證。

func isAuthenticated() bool {
    // 認證邏輯
    return true
}

常見錯誤與陷阱

  1. 零值:布爾類型的零值為 false,需註意未初始化的布爾變數預設為 false
  2. 類型轉換:Go 語言不允許布爾類型與其他類型(如整數)進行隱式轉換。

二、整數類型

定義

在 Go 語言中,整數類型主要分為兩大類:帶符號(Signed)和無符號(Unsigned)的整數,同時還有一個特殊的整數類型 runebyte

  • 帶符號整數: int8, int16, int32, int64, int
  • 無符號整數: uint8, uint16, uint32, uint64, uint
  • 特殊整數: rune (等同於 int32), byte (等同於 uint8)

基礎用法

聲明與初始化

// 聲明並初始化帶符號整數
var a int8 = -128
var b int32 = 2147483647

// 聲明並初始化無符號整數
var c uint8 = 255
var d uint32 = 4294967295

運算符

常用的整數運算符包括:加(+)、減(-)、乘(*)、除(/)和模(%)。

// 整數運算
x := 10
y := 20
result := x + y // 結果為 30

位運算

整數還支持位運算:AND (&), OR (|), XOR (^), 以及位左移 (<<) 和位右移 (>>)。

// 位運算
var m uint8 = 1 << 3 // 結果為 8

進階用法

數據溢出

需要註意的是,整數類型有範圍限制,超過範圍會導致數據溢出。

var maxInt8 int8 = 127
maxInt8 = maxInt8 + 1  // 溢出,結果為 -128

類型轉換

在不同類型之間轉換時,需顯示使用類型轉換。

var integer16 int16 = 32767
var integer32 int32

integer32 = int32(integer16)  // 類型轉換

類型推斷

在使用 := 進行變數聲明和初始化時,Go 語言會自動推斷類型。

autoInt := 42  // 類型推斷為 int

特殊整數類型

rune

rune 類型常用於表示一個 Unicode 字元。

var character rune = 'A'

byte

byte 類型通常用於處理 ASCII 字元或者二進位數據。

var b byte = 'a'

常見問題和陷阱

  1. 類型不匹配:不同整數類型之間不能直接進行運算。
  2. 數據溢出:進行算術運算時需註意數據溢出問題。

三、浮點數類型

定義

在 Go 語言中,浮點數類型主要有兩種:

  • float32: 32 位浮點數,精度約為 7 位小數。
  • float64: 64 位浮點數,精度約為 15 位小數。

基礎用法

聲明與初始化

// 聲明並初始化 float32 和 float64
var a float32 = 3.14
var b float64 = 3.141592653589793

常用運算

常用的運算符包括:加(+)、減(-)、乘(*)、除(/)。

x := 1.1
y := 2.2
result := x + y  // 結果為 3.3

進階用法

精度問題

由於電腦內部表示浮點數的限制,會有精度問題。

// 精度問題
var c float32 = 0.1
var d float32 = 0.2
var e float32 = 0.3

if c+d == e {
    fmt.Println("Equal")
} else {
    fmt.Println("Not Equal")  // 輸出 "Not Equal"
}

數學函數

Go 語言的 math 包提供了豐富的數學函數。

import "math"

// 開方
result := math.Sqrt(16.0)  // 結果為 4.0

類型轉換與推斷

// 類型轉換
var f float32 = 1.1
var g float64
g = float64(f)  // 類型轉換

// 類型推斷
autoFloat := 3.14  // Go 語言會自動推斷為 float64 類型

特殊情況

表示無窮大和 NaN

// 無窮大
var inf float64 = math.Inf(1)

// NaN (Not a Number)
var nan float64 = math.NaN()

與整數的轉換

註意:轉換時可能會有精度損失。

var h float64 = 3.9
var i int = int(h)  // 結果為 3

常見問題和陷阱

  1. 精度問題:進行浮點數運算時,需要註意精度問題。
  2. 類型轉換:在整數和浮點數之間轉換時,要註意精度損失。

四、字元串類型

定義

在 Go 語言中,字元串類型被定義為一串不可變的位元組序列,通常用於存儲文本數據。

// 聲明一個字元串類型的變數
var str string

基礎用法

聲明和初始化

// 聲明並初始化一個字元串
var hello string = "Hello, world!"

或者使用短變數聲明:

hello := "Hello, world!"

常用操作

字元串拼接:

str1 := "Hello"
str2 := "World"
result := str1 + ", " + str2  // 結果:"Hello, World"

獲取字元串長度:

length := len("Hello, World!")  // 結果:13

進階用法

字元串與位元組切片

在 Go 中,可以方便地在字元串和位元組切片之間進行轉換。

// 字元串轉位元組切片
byteSlice := []byte("Hello")

// 位元組切片轉字元串
str := string(byteSlice)

字元串截取

// 截取字元串中的部分字元
subStr := "Hello, World!"[7:12]  // 結果:"World"

字元串遍歷

// 遍歷字元串中的每一個字元
for i, r := range "Hello" {
    fmt.Printf("%d: %c\n", i, r)
}

輸出:

0: H
1: e
2: l
3: l
4: o

特殊用法

多行字元串

使用反引號( ` )可以聲明一個多行字元串。

multiLineStr := `This is
a multi-line
string.`

轉義字元

Go 字元串支持多種轉義字元,如 \n(換行)、\t(製表符)等。

// 使用轉義字元
escapedStr := "This is a line.\nThis is another line."

常見問題和陷阱

  1. 不可變性:Go 字元串是不可變的,任何嘗試改變字元串內容的操作都會創建一個新的字元串。
  2. Unicode 和 UTF-8:Go 字元串預設使用 UTF-8 編碼,這意味著一個字元串可能包含多種不同長度的字元。

五、其他特性

在前幾章節中,我們詳細地探究了 Go 語言的各種內置類型:從布爾型到整數、浮點數和字元串。這些基礎類型構成了 Go 語言的基礎結構,對於編寫高性能和可維護代碼非常重要。

類型系統的簡潔與高效

Go 語言的類型系統相對簡單,但並不意味著它不強大或靈活。恰恰相反,Go 語言提供了一套非常高效和易於理解的類型機制。

var isActive bool  // 布爾類型
var price int32    // 整數類型
var pi float32     // 浮點數類型
var name string    // 字元串類型

為什麼不可變性很重要

在 Go 中,字元串是不可變的,這有助於多線程編程。不可變性確保了在併發訪問時,數據狀態始終是可預測的。

// 字元串不可變性示例
str := "immutable"
// str[0] = 'I'  // 編譯錯誤

性能與優化

Go 提供了大量內建函數和標準庫,以優化各種類型的操作。

import "math"

// 浮點數優化
result := math.Floor(3.75)  // 輸出:3.0

其他

  1. 類型別名與自定義類型: Go 允許你創建類型別名和自定義類型,這對於編寫領域特定代碼非常有用。
  2. 嚴格類型檢查: Go 的編譯器會進行嚴格的類型檢查,這大大減少了運行時錯誤。
  3. 減少轉換: Go 的類型推斷和介面機制,減少了不必要的類型轉換。

關註微信公眾號【TechLeadCloud】,分享互聯網架構、雲服務技術的全維度知識。作者擁有10+年互聯網服務架構、AI產品研發經驗、團隊管理經驗,同濟本復旦碩,復旦機器人智能實驗室成員,阿裡雲認證的資深架構師,項目管理專業人士,上億營收AI產品研發負責人。
如有幫助,請多關註
個人微信公眾號:【TechLeadCloud】分享AI與雲服務研發的全維度知識,談談我作為TechLead對技術的獨特洞察。
TeahLead KrisChang,10+年的互聯網和人工智慧從業經驗,10年+技術和業務團隊管理經驗,同濟軟體工程本科,復旦工程管理碩士,阿裡雲認證雲服務資深架構師,上億營收AI產品業務負責人。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 函數是一組語句,可以在程式中重覆使用。函數不會在頁面載入時自動執行。函數將通過調用函數來執行。 ### 創建函數 要創建(通常稱為聲明)一個函數,請執行以下操作: - 使用 `func` 關鍵字。 - 指定函數的名稱,後跟括弧 `()`。 - 最後,在花括弧 `{}` 內添加定義函數應執行的代碼。 ...
  • 1.雙擊圖標 2.彈出如下對話框: 3、單擊按鈕Next,彈出如下對話框: 4、單擊按鈕I Agree,彈出如下對話框: 5、單擊按鈕Next,彈出如下對話框: 6、單擊Browse按鈕,可以重新設置安裝路徑 7、路徑重新設置後,單擊確定按鈕彈出如下對話框(註意,此時路徑已更改): 註意:如果想要設 ...
  • # 集合總結 ## 一、概述 1. 作用:存儲對象的容器,代替數組的,使用更加的便捷 2. 所處的位置:java.util 3. 體繫結構 ![image](https://img2023.cnblogs.com/blog/3245131/202309/3245131-202309071934421 ...
  • Vue 3 的Composition API + ``` ``` 這就把清單功能獨立出來,可在任意需要的地方復用。 基於組件去搭建應用,可實現對業務邏輯的復用。如有其他頁面也需要用到這功能,直接復用。 然後,就可基於新語法實現清單應用。 把之前的代碼移植過來後,使用ref包裹的響應式數據。修改tit ...
  • # Python名稱空間和作用域,閉包函數 - 名稱的查詢順序 - 名稱空間的作用域 - global和nonlocal關鍵字的使用 - 函數對象(函數名) - 函數的嵌套調用 - 函數的嵌套定義 - 閉包函數 ## 名稱空間 ### 定義 ```python # 什麼是名稱空間? 名稱空間即存放名 ...
  • 作者:七寸知架構 \ 鏈接:https://www.jianshu.com/p/ec40a82cae28 # 1 引言# 本文主要講解JDBC怎麼演變到Mybatis的漸變過程,**重點講解了為什麼要將JDBC封裝成Mybaits這樣一個持久層框架**。再而論述Mybatis作為一個數據持久層框架本 ...
  • 網上查到的設計模式有23種,通過歸納去認識他們也是一種不錯的視角。 我這邊不按照主流的觀點去劃分為創建型、結構型、行為型三大類,我只歸納為創建型(Creational Class)、簡單功能場景(Simple Method Class)、複雜功能場景(Complex Method Class)三大類 ...
  • Matplotlib 中的圖例是幫助觀察者理解圖像數據的重要工具。圖例通常包含在圖像中,用於解釋不同的顏色、形狀、標簽和其他元素。 # 1. 主要參數 當不設置圖例的參數時,預設的圖例是這樣的。 ```python import numpy as np import matplotlib.pyplo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...