Golang學習筆記:基礎語法(變數、常數、基礎型別…等)

最後更新於 2021 年 5 月 21 日

接續上一篇

https://namepluto.com/3940/

注釋

注釋的內容不會被編譯,在寫程式的過程中請盡量使用注釋來幫助自己加深記憶,若是與其他人共同撰寫時也能使他人快速理解該段程式碼的意義。

//單行注釋
fmt.Println("單行注釋")

/*
多行
 注釋
*/
fmt.Println("多行注釋")

變數

使用 var 關鍵字是Go最基本的變數宣告方式:

//將型別放在變數名稱後方
var name string
var age int
var enable bool

在變數名稱後加上變數型別,若無賦值(初始化)則變數會被初始化成其型別的預設值。

  • 整型和浮點型變數的預設值為 0
  • 字串變數的預設值為空字串 ""
  • 布林型變數預設為 false
  • 切片、函式、指標變數的預設為 nil

要注意的是變數名稱、型別…等都是 有區分大小寫

//型態區分大小寫
var name String //Wrong
var name string
var age Int //wrong
var age int
//變數名稱區分大小寫
var Computer = "大寫C"
var computer = "小寫c"
fmt.Println(Computer,computer) //大寫C 小寫c

變數規則

1.變數名稱首字符不能為數字,可以是字母或者下划線(_):

_myName
_temp
iPad
applePencil
a_123
2021 //wrong
4abc // wrong

2.Go語言中關鍵字保留字都不能作變數名,也不能帶有運算符(+,-,*,/…)

關鍵字即是被Go語言賦予特殊涵義的單字,也可稱為保留字。Go語言中的關鍵字共有25個:

breakdefault funcinterfaceselect
casedefergomapstruct
chanelsegotopackageswitch
constfallthroughifrangetype
continueforimportreturnvar

3.Go 語言中的變數需要宣告後才能使用,並且宣告後必須使用。

變數初始化

第一種、指定資料型別

var name string = "小明"
var age int = 18

注意:字串必須使用“雙引號”‘單引號’ 會報錯

第二種、根據值判斷型別

Go 還可以根據你賦予的初值來判斷該變數為何種型別,因此也能這麼寫:

var name,address,email  = "小明","台北市","a123@gmail.com"
fmt.Println(name) //印出變數值 小明
fmt.Println(name,address,email) //多個變數印出 小明 台北市 a123@gmail.com

第三種、使用 :=

使用 := 省略掉 var 並初始化變數,要注意的是 := 左側必須為新定義的變數

name, address, email := "小明", "台北市", "a123@gmail.com"
fmt.Println(name,address,email) //小明 台北市 a123@gmail.com

像是下方這個例子會引發編譯錯誤

var age int
age := 21 //編譯錯誤 age已經定義不需重新定義

注意

只能在函數體內使用 := 宣告變數,不可用於全局變數的宣告與賦值。

常數

在程式編譯階段就確定下來的值,而程式在執行時無法改變該值

常數可定義為數值、布林值字串等型別。

const Pi = 3.1415926
const Size = 50
const prefix = "Pluto_"
Size = 20 // 當你試著去修改常數的值,會引發 cannot assign to Size 錯誤

iota

自增長常數,在const{}添加一個關鍵字 iota ,每行的iota都會累加1,第一行iota默認為0

const(
	Taipei = iota
	Taoyuan
	Taichung
	Kaohsiung
	Tainan
)

fmt.Println(Taipei) //0
fmt.Println(Taoyuan) //1
fmt.Println(Taichung) //2
fmt.Println(Kaohsiung) //3
fmt.Println(Tainan) //4

iota可以定義數量級(ex: KB,MB,GB,TB…等類似的單位也可以用此來定義)

const(
	Taipei = iota*10
	Taoyuan
	Taichung
	Kaohsiung
	Tainan
)

fmt.Println(Taipei) //0
fmt.Println(Taoyuan) //10
fmt.Println(Taichung) //20
fmt.Println(Kaohsiung) //30
fmt.Println(Tainan) //40

複雜一點的話

const(
	a,b = iota+1,iota+2 // iota = 0 , a = 0+1 = 1 , b = 0+2 = 2
	c,d // iota = 1 , c = 1+1 = 2 , d = 1+2 = 3
	e,f // iota = 2 , e = 2+1 = 3 , f = 2+2 = 4

	g,h = iota*2,iota*3 //iota = 3 , g = 3*2 = 6 , h = 3*3 = 9
	i,j //iota = 4 , i = 4*2 = 8 , j = 4*3 = 12
)

fmt.Println("a = %d , b = %d",a,b) // a = 1 , b = 2
fmt.Println("c = %d , d = %d",c,d) // c = 2 , d = 3
fmt.Println("e = %d , f = %d",e,f) // e = 3 , f = 4
fmt.Println("g = %d , h = %d",g,h) // g = 6 , h = 9
fmt.Println("i = %d , j = %d",i,j) // i = 8 , j = 12

分組宣告

同時宣告多個變數、常數或匯入多個套件時都可以採用分組的方式進行宣告。

匯入多組套件

import "fmt"
import "os"

可寫為:

import(
	"fmt"
	"os"
)

宣告多個常數

const Pi = 3.1415926
const Size = 50
const prefix = "Pluto_"

可寫為:

const(
	Pi = 3.1415926
	Size = 50
	prefix = "Pluto_"
)

宣告多個變數

var i int
var pi float32
var enable bool

可寫為:

var(
	i int
	pi float32
	enable bool
)

資料型別

  • 基本資料型別

布林(bool)、數值、字串(string)

  • 高級資料型別

陣列(array)、切片(slice)、字典(map)、通道(channel)、函數(function)、結構體(function)、接口(interface)、指針(pointer,unitptr,*Xxx)

布林

Go的布林型別為bool,值是 true 或false,預設為false。

以下三種方式皆可宣告

var enabled,disabled bool = false,true
var enabled,disabled = false,true
enabled,disabled := false,true

賦值

enabled = true

布林運算

Go語言內建的運算子有:

  • 算術運算子
  • 比較運算子
  • 邏輯運算子
  • 位元運算子
  • 賦值運算子
  • 其他運算子

可以對布林值使用邏輯運算子以及相等( == )或不等( != )。

運算子描述實例
&&邏輯 AND 運算子。 如果兩邊的操作數都是 True,則條件 True,否則為 False。(A && B) 為 False
||邏輯 OR 運算子。 如果兩邊的操作數有一個 True,則條件 True,否則為 False。(A || B) 為 True
!邏輯 NOT 運算子。 如果條件為 True,則邏輯 NOT 條件 False,否則為 True。!(A && B) 為 True

布林型別範例:

truth := 3 <= 5
falsehood := 10 > 12

res1 := 10 > 15 && 4 == 5
res2 := 2*2 == 4 || 10%3 == 0

fmt.Println(truth, falsehood, res1, res2) // true false false true

數值

整數

整數型別有 無符號有符號 兩種,Go同時支援 intunit,這兩種型別的長度相同,但具體長度取決於不同編譯器的實現。

int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr

有號數

型別大小範圍
int88 bits-128 到 127
int1616 bits-215 到 215 -1
int3232 bits-231 到 231 -1
int6464 bits-263 到 263 -1
int取決於平台取決於平台
泛型 int 型別的大小取決於平台。在 32 位元系統上,它的大小為 32 位元,在 64 位元系統上,它的大小為 64 位元。

無號數

型別大小範圍
uint88 bits0 到 255
uint1616 bits0 到 216 -1
uint3232 bits0 到 232 -1
uint6464 bits0 到 264 -1
uint取決於平台取決於平台
uint 型別的大小取決於平台。在 32 位元系統上,它的大小為 32 位元,在 64 位元系統上,它的大小為 64 位元。

*另外還有 byte(uint8的別名) 和 rune(int32的別名)

Golang 沒有 char 資料型別。它使用 byterune 來表示字元值。
byte 資料型別用於表示 ASCII 字元,以及 rune 資料型別用於表示以 UTF-8 格式編碼的一組更廣泛的 Unicode 字元。

浮點數

用於儲存帶小數部分的數字(如:3.1415926、123.45)。沒有 float 型別

float32 float64

float32 在記憶體中佔用 32 位元,並以單精度浮點數格式儲存數值。
float64 在記憶體中佔用 64 位元,並以雙精度浮點數格式儲存數值。

浮點數的預設型別是 float64

複數

complex64 complex128

complex64:實部和虛部都是 float32 型別。
complex128:實部和虛部都是 float64 型別。

複數的預設型別是 complex128

宣告複數

x := 3 + 2i //type complex128
fmt.Println(x) // (3+2i)

使用變數來建立複數需要使用到內建的 complex 函數:(複數的實部虛部都必須是相同的浮點數型別)

a := 3.5
b := 6.2
c := complex(a,b)
fmt.Println(c) // (3.5+6.2i)

注意

不同型別的變數之間不允許互相賦值或操作,不然在編譯時會引起編譯器報錯。

數值運算

可使用 算術運算子、比較運算子、位元運算子、賦值運算子 來做數值運算。

算術運算子

A = 10 , B = 20

運算子描述實例
+相加A + B 輸出結果 30
相减A – B 輸出結果 -10
*相乘A * B 輸出結果 200
/相除B / A 輸出結果 2
%求余B % A 輸出結果 0
++自增A++ 輸出結果 11
自减A– 输輸出結果 9

比較運算子

A = 10 , B = 20

運算子描述實例
==檢查兩個值是否相等,如果相等返回 True 否則返回 False。(A == B) 為 False
!=檢查兩個值是否不相等,如果不相等返回 True 否則返回 False。(A != B) 為 True
>檢查左邊值是否大於右邊值,如果是返回 True 否則返回 False。(A > B) 為 False
<檢查左邊值是否小於右邊值,如果是返回 True 否則返回 False。(A < B) 為 True
>=檢查左邊值是否大於等於右邊值,如果是返回 True 否則返回 False。(A >= B) 為 False
<=檢查左邊值是否小於等於右邊值,如果是返回 True 否則返回 False。(A <= B) 為 True

位元運算子

包括 & (and), | (or), ^ (xor), << (左移n位,就是乘以2的n次方), >> (右移n位,就是除以2的n次方)

pqp & qp | qp ^ q
00000
01011
11110
10011

假設 p 為 20
p << 2 為 p * 22 = 20 * 4 = 80
p >> 2 為 p / 22 = 20 / 4 = 5

賦值運算子

運算子描述實例
=簡單的賦值運算符,將一個表達式的值賦給一個左值C = A + B 將 A + B 表達式結果賦值給 C
+=相加后再賦值C += A 等於 C = C + A
-=相減后再賦值C -= A 等於 C = C – A
*=相乘后再賦值C *= A 等於 C = C * A
/=相除后再賦值C /= A 等於 C = C / A
%=求餘后再賦值C %= A 等於 C = C % A
<<=左移后賦值C <<= 2 等於 C = C << 2
>>=右移后賦值C >>= 2 等於 C = C >> 2
&=按位與(and)后賦值C &= 2 等於 C = C & 2
^=按位異或(xor)后賦值C ^= 2 等於 C = C ^ 2
|=按位或(or)后賦值C |= 2 等於 C = C | 2

字串

Go的字串都是採用UTF-8字符集編碼,字串由一對雙引號( " " )或反引號( ` ` )括起來定義。

var emptyStr string = "" //宣告字串變數 初始化為空字串

var hisName string 
hisName = "Jason" //賦值

/* 簡短宣告 */
myAge := "21" //雙引號
myAge := `21` //反引號

宣告多行字串

使用反引號( ` ` )括起的字串為Raw字串,程式碼怎麼寫就怎麼印,包括空格空行,沒有字元轉義。

str := `Hello
World`
fmt.Println(str)

輸出為

Hello
World

在字串內使用空格

str2 := `Hello
        World`
fmt.Println(str2)

輸出為

Hello
    World

字串連接

  • 字串與字串連接

使用 + 連接字串

fmt.Println("Hello " + "World")
  • 字串型別的變數之間連接

使用 , 隔開

str1 := "Hello"
str2 := "World"
fmt.Println(str1,str2) //Hello World , 字串型別變數連接會自動在兩個變數之間加入空格
  • 字串與其他變數型別連接

使用 , 隔開字串與變數

num := 3
fmt.Println("Number:",num) //Number: 3

字串分割

str := "Hello, World"
str1 := strings.Split(str, ",")

fmt.Println(str1) // [Hello  World]
fmt.Println(str1[0]) // Hello
fmt.Println(str1[1]) // World

字串替換

str := "梅花梅花幾月開"
//字串替換, -1表示全部替換, 0表示不替換, 1表示替換第一個, 2表示替換第二個
str1 := strings.Replace(str, "梅花", "桃花", -1)
fmt.Println(str1) // 桃花桃花幾月開

leetcode有一題easy題可以使用字串替換快速解出

1108.Defanging an IP Address

Given a valid (IPv4) IP address, return a defanged version of that IP address.
A defanged IP address replaces every period “.” with “[.]”.

Example 1:

Input: address = “1.1.1.1”
Output: “1[.]1[.]1[.]1”

Example 2:

Input: address = “255.100.50.0”
Output: “255[.]100[.]50[.]0”

sol:

func defangIPaddr(address string) string {
    ip := strings.Replace(address, ".", "[.]", -1)
    return ip
}

字串擷取

str := "Hello, World"
str1 := str[3 : 8] //[3,8)
fmt.Println(str1) //lo, W

補充

大寫字母開頭 ( 大駝峰 ) 的變數是可匯出的,也就是其它套件可以讀取的,是公有變數

小寫字母開頭 ( 小駝峰 ) 的就是不可匯出的,是私有變數

大寫字母開頭 ( 大駝峰 ) 的函式也是一樣,相當於 class 中的帶 public 關鍵詞的公有函式

小寫字母開頭 ( 小駝峰 ) 的就是有 private 關鍵詞的私有函式

// 公有函式,可以被外部package的代碼所使用
func Test() {
   //code
}

// 私有函式,package的内部可見
func test2() {
   //code
}

參考資料

4e52d54f6bc42abb41d26eb5b0df6517?s=250&d=wavatar&r=g Golang學習筆記:基礎語法(變數、常數、基礎型別...等)
5 1 評分
Article Rating
訂閱
通知
guest
0 Comments
在線反饋
查看所有評論