Golang 筆記
  • Introduction
  • 安裝Golang
    • 本地編譯與安裝第三方套件
    • 第一個 GO 程式
    • export 與 import
    • 使用 go mod
  • 基本工具
  • DataBase操作
    • MySQL
    • 使用 ORM
    • MongoDB
  • 基本語法
    • Variable
    • BSON
    • JSON
    • 時間相關
    • Interface
    • Error
    • 型別
    • 字串
    • defer
    • panic, recover
    • Channel 與Goroutine
      • 讀寫鎖
      • for select 與 for range
      • UnBuffered channel 與 Buffered channel
    • Function
    • pointer
    • regExp
    • fmt
    • Make vs New
    • struct
    • Array, Slice 陣列
    • map
  • 核心模組
    • Reflect
    • File
    • Signal
    • BuiltIn
    • Sync
    • IO
    • Sort
    • http
    • crypto
    • context
  • 第三方模組
    • Dom Parser
    • gin 框架
    • Websocket
    • Iris框架
      • 讀取 Body 資料
      • 相關範例
    • Fiber 框架
    • 自動重啟 server 工具
    • go-jwt
  • 測試
  • 原始碼解析
  • 常見問題
    • 資料存取不正確
    • Data races
Powered by GitBook
On this page
  • 1.型別定義在變數名稱後
  • 2.一次定義多個同型別的變數
  • 3.直接定義並賦值
  • 4.同時定義多個變數並賦值
  • 5.使用:= 宣告 可省略var和type
  • 6.有關 _
  • 7.型別轉換
  • 8.型別別名(Type alias)
  • Golang所有可用型別
  • Rune
  • byte array to string
  • 查看型別

Was this helpful?

  1. 基本語法

型別

1.型別定義在變數名稱後

var appleNum int // 一般變數
const appleNum int // 常數

2.一次定義多個同型別的變數

var AppleNum1, AppleNum2, AppleNum3 int

或是

var (
    isIt   bool      = false
    initInt uint64   = 1000
    z      complex128 = -5 + 12i
)

3.直接定義並賦值

var AppleNum int = 5

4.同時定義多個變數並賦值

var AppleNum1, AppleNum2, AppleNum3 int = 1, 2, 3

上面幾點如果直接賦值但沒有加型別,go語言會自動判斷

5.使用:= 宣告 可省略var和type

func main() {
  appleNum := 5
}

:= 只可用在函式內,放在top level會出現錯誤; 如果用 := 又加了var 和型別也會錯誤

所以用var 或const 通常用來定義全域變數才使用

6.有關 _

_(下劃線)是個特殊的變量名,任何賦予它的值都會被丟棄

可用於部分回傳值參數不想處理的時候

7.型別轉換

使用 type(要轉換的變數),例如int(..), float64(..) 等等

func main() {
    var x, y int = 3, 4
    var f float64 = math.Sqrt(float64(x*x + y*y))
    var z int = int(f)
    fmt.Println(x, y, z)
}

int8 與int32也不可直接運算,需要轉換

不能用 int(a) 要用 a.(int)

8.型別別名(Type alias)

type (
    水果數 int8
    水果名稱 string
)

func main() {
    var fruitNum 水果數
    var fruitName 水果名稱
    fruitNum = 5
    fruitName = "香蕉"
    fmt.Println(fruitNum)
    fmt.Println(fruitName)
}

Golang所有可用型別

bool  // 布林值

string // 字串

int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 
uintptr // 保存指針用的類型,在32平台下為4字節(bytes),在64位平台下是8字節。
// var p *int

byte // uint8 的別名

rune // int32 的別名
     // 代表一個Unicode碼

float32 float64

complex64 // 複數(32位實數+32位虛數)
complex128 //(64位實數+64位虛數)

Rune

範例:

var str = "hello 你好"
fmt.Println("len(str):", len(str))  // 12
fmt.Println("rune:", len([]rune(str))) // 8

golang中string底層實作為byte。中文字符在unicode下占2個byte,在utf-8編碼為3個byte,而golang默認編碼為utf8。

所以用rune才能正確算出中文字長度。

byte array to string

string(someByteArray[:])

如果有轉為 hex string

hex.EncodeToString(someByteArray[:])

查看型別

package main

import (
  "fmt"
  "reflect"
)

func main() {
  fmt.Println(reflect.TypeOf("test"))
}
PreviousErrorNext字串

Last updated 4 years ago

Was this helpful?

有一些例外情況必須用

Type_assertions
https://stackoverflow.com/a/18041561/4622645
https://golang.org/ref/spec#Type_assertions
https://play.golang.org/p/HHs6xDipuZ