速戰速決 go https://github.com/webabcd/GoSample
作者 webabcd
速戰速決 go - go 概述: 基本語法,nil
示例如下:
summary.go
// go 概述 - 基本語法,nil
// 注:
// 1、go 是通過 GC 清理的
// 2、go 是通過開頭字母大小寫來控制可見性的
// 如果定義的常量、變量、類型、接口、接口中的方法,結構體、結構體中的成員、函數等的名稱是大寫字母開頭,則表示能被其它包訪問或調用,非大寫字母開頭就只能在包內使用
package main
import (
"fmt"
"math"
)
func summary() {
summary_sample1()
summary_sample2()
}
// 基本語法
func summary_sample1() {
// 運算符 =, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=, ||, &&, |, ^, &, ==, !=, <, <=, >, >=, <<, >>, +, -, *, /, %, !, *, &, ++, --
// 變量的聲明和初始化
var a int = 1
var b = 2 // 編譯器推導類型
var c, d int = 3, 4 // c, d int 的意思是 c 和 d 都是 int 類型
var (
e int = 5
f = 6
)
// 聲明的簡短格式(必須要初始化,必須要由編譯器推導類型,只能在函數內部聲明)
g := 7
h, i := 8, 9
// const 常量
const pi = math.Pi
// _ 表示匿名變量,後續是不可使用的,如果你使用這個變量則會報錯
var _ int = 10
fmt.Println(a, b, c, d, e, f, g, h, i, pi) // 1 2 3 4 5 6 7 8 9 3.141592653589793
// 通過 {} 構造數組或切片或字典時,需要注意
// } 與最後一個元素在同一行時,最後一個元素後面不用加逗號
j := [3]int{1, 2, 3}
// } 與最後一個元素不在同一行時,最後一個元素後面要加逗號
k := [3]int{
1, 2, 3,
}
fmt.Println(j, k) // [1 2 3] [1 2 3]
l := &struct {
a int
}{}
// 雖然 l 是指針,需要這麼 (*l).a = 123 使用,但是 go 是支持語法糖(syntactic sugar)技術的,他會自動轉換的,所以你可以這麼 l.a = 456 使用
(*l).a = 123
l.a = 456
fmt.Println(l) // &{456}
}
// nil
func summary_sample2() {
// nil 和 nil 是不能做相等判斷的,下面這句會編譯時報錯
// fmt.Println(nil == nil)
// 指針的默認值是 nil
var a *int
var b *int
var c *string
// 指針 a, b, c 本身的值都是 0x0
fmt.Printf("%p, %p, %p\n", a, b, c) // 0x0, 0x0, 0x0
// 判斷指針是否爲 nil 就用 == 即可
fmt.Println(a == nil, b == nil, c == nil) // true true true
// 指向相同類型的指針,如果他們都是 nil 則可以做相等判斷(切片類型除外)
fmt.Println(a == b) // true
// 指向不同類型的指針,即使他們都是 nil 也不能做相等判斷,下面這句會編譯時報錯
// fmt.Println(a == c)
var d []int
var e []int
// 可以通過 == 判斷某一個切片是否爲 nil
fmt.Println(d == nil, e == nil) // true true
// 但是因爲切片類型是不能通過 == 做相等判斷的,所以即使兩個切片類型的指針都是 nil 也不能做相等判斷,下面這句會編譯時報錯
// fmt.Println(d == e)
}
速戰速決 go https://github.com/webabcd/GoSample
作者 webabcd