Go 基礎教程--4-常量與運算子

zhangsen發表於2019-09-16

筆記地址:https://www.cnblogs.com/ghj1976/archive/20...

常量的定義

  1. 常量的值在編譯時就已經確定
  2. 常量的定義格式與變數基本相同
  3. 等號右側必須是常量或者常量表示式
  4. 常量表示式中的函式必須是內建函式

示例1:

package main
import(
    "fmt"
)
const a int = 1
const b = "A"
const (
    c = a
    d = a + 1
    e = 3
)

func main() {
    fmt.Println(a)
    fmt.Println(d)
}

示例2:

package main
import(
    "fmt"
)
const a, b, c = 1,2,'A'
const (
    d,e,f = 1,2,3
)

func main() {
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
}
//1
//2
//65  為什麼是65??

示例3:

在定義常量組時,如果不提供初始值,則表示將使用上行的表示式

package main
import(
    "fmt"
)
const (
    a =1
    b
    c
)
func main() {
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
}
//1
//1
//1

示例4:

等號右側必須是常量或者常量表示式,不能是執行時才能取得的變數

sss 在編譯時不存在

package main
import(
    "fmt"
)
var sss = "123"
const  (
    a = len(sss)
    b
    c
)
func main() {
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
}
// const initializer len(sss) is not a constant
//常量的初始值不是一個常量

調整後

package main
import(
    "fmt"
)
const (
    a = "123"
    b = len(a)
    c
)
func main() {
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
}
//123
//3
//3

錯誤示範:

const (
    a, b = 1, '2'
    c
)

func main() {
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
}
//extra expression in const declaration
const宣告中的額外表示式
在定義常量組時,如果不提供初始值,則表示將使用上行的表示式,但是個數必須一致

正確示範:

const (
    a, b = 1, '2'
    c , d
)

func main() {
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
}
//1
//50
//1

問題:fmt.Println(b)得到的為什麼是50呢?

const (
    a, b = 1, "2"
    c , d
)

func main() {
    fmt.Println(b)
}
//2

在Go中單引號和雙引號的區別

常量的初始化規則與列舉

  1. 在定義常量組時,如果不提供初始值,則表示將使用上行的表示式
  2. 使用相同的表示式不代表具有相同的值
  3. iota是常量的計數器,從0開始,組中每定義1個常量自動遞增1
  4. 通過初始化規則與iota可以達到列舉的效果
  5. 每遇到一個const關鍵字,iota就會重置為0

示範1:

iota是常量的計數器,從0開始,組中每定義1個常量自動遞增1

const (
    a = "A"
    b
    c = iota
    d = 'A'
)
func main() {
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
    fmt.Println(d)
}
//A
//A
//2 計數器從0開始,每定義一次變數就加一,這裡是第三次呼叫,是2
//65 單引號和雙引號的區別

示例2:

const (
    a = "A"
    b
    c = iota
    d = 'A'
)

const (
    e
)
func main() {
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(c)
    fmt.Println(d)
}
// missing value in const declaration
變數沒有定義,因為沒有上一行

運算子

==Go中的運算子均是從左至右結合==

==優先順序(從高到低)==

^      !                                           (一元運算子)
*       /    %    <<    >>    &      &^
+      -     |      ^                              (二元運算子)
==   !=   <    <=    >=    >
<-                                                 (專門用於channel)
&&
||

示範1:

1 << 10 
1左移10位, = 1024
0000 0001

與或非等

  6 : 0110
  10: 1011
&     0010 兩個都為1才是1
|     1111 有一個是1就為1
^     1101 不同的時候才為1

&^    0100  如果在第二個數上的一位上面是1,就要把第一個數上的一位強制改為0

示例3:&&

func main() {
    a := 0
    if  a > 0 && (10/a) > 1 {
        fmt.Println("ok")
    }
}
&&的作用:
a>0 成立才執行後面的,不成立就不執行

作業

請嘗試結合常量的iota與<<運算子實現計算機儲存單位的列舉

package main

import "fmt"
const (
    B float64 = 1 << (iota * 10)
    KB
    MB
    GB
)
func main() {
    fmt.Println(GB)
}
//1.073741824e+09

相關文章