Golang有指針 , 但是有些人生下來就是指針類型哇 , 跟Java的對象一樣, 天生他就是一個指針類型. 但是Golang有些人不是哇, 他生下來不是指針類型. 難受不, 怎么區分呢 , 我教大家一個小妙招 . 看我下面這個例子
記住用偉大的Jetbrains的編譯器Goland, 可以提示代碼錯誤奧 !
package main
import "fmt"
func main() {
// 生下來一個ch
ch := make(chan int)
// ch如果是指針類型就可以和nil比較了
fmt.Println(ch==nil)
}
**就上訴一段代碼 , 讓你明白啥對象生下來我就是指針類型. 啥對象生下來他不是指針類型 , 如果你掌握了,我覺得那些書你不用看了 ,編程拼的就是巧和效率 , 如果有些人跟你說一堆 , 啥是引用類型,啥是按值傳遞 , 算了別看, 就看我這個, 他是誤導你了, 是有些對象生下來他就是指針類型 , 懂了嗎, 編譯器做的你改不了, 你要改就寫個編譯器 . **
我給大家列出來 , 哪些對象哇 , 他生下來就是指針類型. 都是靠我上面的小技巧獲取的,還有自己的一些經驗
生下來就是指針類型
-
chan , 是一個阻塞隊列,你可以這么理解, 后期學習吧, 類似於Java的BlockingQueue .
-
map , 偉大的map , 其實就是Java的HashMap.
-
切片(slice) , 就是沒有指定長度的數組 ,類似於Java的ArrayList,會自動擴容.
-
函數 , 比如
fun := func(s string) string { return "modify" + s }
-
interface : 一個類型為
interface{} 或者 interface接口
的變量可能是指針變量 , 也可能是普通變量 .// 定義一個接口 type UserService interface { } // str可以是指針類型變量也可以是普通變量 , fun5也是 func fun4(str interface{}) { } func fun5(str UserService) { } func main() { // u 代表是一個指針類型變量或一個普通變量 ,同理 var x interface{} 也是代表一個指針類型變量或一個普通變量 var u UserService // 調用 fun4(u) fun5(u) }
-
function type. 比如
type Func func(string)
, 這個 Func就是一個function type.type Func func(string) func main() { fun := Func(func(s string) {}) fmt.Println(fun == nil) // false }
生下來不是指針類型的
-
struct , 如果成員變量為基本數據類型就是初始化值, 如果成員變量的指針類型則是nil.(前提你不賦值的情況下.)
-
基本數據類型,初始化值如下
bool //默認值為false string //默認值為空字符串,為"" int int8 int16 int32 int64 //默認值為0 uint uint8 uint16 uint32 uint64 uintptr //默認值為0 byte // uint8 的別名 rune // int32 的別名 float32 float64 //默認值為0 complex64 complex128 //默認值為0
-
數組 , 數組是初始化就定義了大小的 , 記得與切片區分開.
兩大操作符
操作符&(取址符) : 是返回該變量的內存地址。
操作符* (取值符) : 是返回該指針指向的變量的值, 同時也可以進行修改指針指向內存地址的值.
空指針 :
當一個指針類型的變量被定義后沒有分配到任何變量時,它的值為 nil。
nil 指針也稱為空指針。
nil在概念上和其它語言的null、None、nil、NULL一樣,都指代零值或空值.
占位符
%d 十進制整數
%x, %o, %b 十六進制,八進制,二進制整數。
%f, %g, %e 浮點數: 3.141593 3.141592653589793 3.141593e+00
%t 布爾:true或false
%c 字符(rune) (Unicode碼點)
%s 字符串
%q 帶雙引號的字符串"abc"或帶單引號的字符'c'
%v 變量的自然形式(natural format)
%T 變量的類型
%% 字面上的百分號標志(無操作數)
%p 打印指針類型的地址(十六進制)
Golang 的全部類型
這個是官方給的類型, 只有兩種 一種是數值類型一種是派生類型.
數值類型
-
布爾型
bool
布爾型的值只可以是常量true
或者false
,默認值為false
。 -
字符串類型
string
編碼統一為UTF-8
編碼標識Unicode
文本,默認值為空字符串。 -
整型(默認值為 0)
uint8
: 無符號 8 位整型(0 ~ 255);uint16
:無符號 16 位整型(0 ~ 65535);uint32
:無符號 32 位整型(0 ~ 4294967295);uint64
:無符號 64 位整型(0 ~ 18446744073709551615);int8
:有符號 8 位整型(-128 ~ 127);int16
:有符號 16 位整型(-32768 ~ 32767);int32
:有符號 32 位整型(-2147483648 ~ 2147483647);int64
:有符號 64 位整型(-9223372036854775808 ~ 9223372036854775807)
-
浮點型(默認值為 0)
float32
:IEEE-754
32 位浮點數;float64
:IEEE-754
64 位浮點數;complex64
:32 位實數和虛數;complex128
:64 位實數和虛數;
-
其他數值類型
byte
:類似uint8
;rune
:類似int32
;uint
:32 或 64 位;int
:與uint
一樣大小;uintptr
:無符號整型,用於存放一個指針;
派生類型
- 指針類型(Pointer)
- 數組類型 ([len]byte)
- 結構化類型(struct)
- Channel 類型(chan)
- 函數類型(func)
- 切片類型(slice)
- 接口類型(interface)
- Map 類型(map)