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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...