499689317 / notes

note
2 stars 0 forks source link

Golang零值 #16

Open 499689317 opened 6 years ago

499689317 commented 2 years ago
package main

// 有多个package main文件时,go run 命令需要将多个main package文件列出来:go run *.go
import (
    "fmt"
)

type TestStu struct {
    X int
    Y int
}

func InitTypes() {
    // 1. 字符串,数组,切片,map,结构体
    // 2. channel,函数,接口
    // 3. 指针类型
    var i int
    fmt.Println("int 0 value", i)
    var iPtr *int
    fmt.Println("*int 0 value", iPtr, iPtr == nil)
    fmt.Printf("int ptr, %p, %p\n", &i, iPtr)
    fmt.Println()

    var str string
    fmt.Println("string 0 value", str)
    var strPtr *string
    fmt.Println("*string 0 value", strPtr, strPtr == nil)
    fmt.Printf("string ptr, %p, %p\n", &str, strPtr)
    fmt.Println()

    var arr [2]int
    fmt.Println("array 0 value", arr)
    var arrPtr *[2]int
    fmt.Println("*array 0 value", arrPtr, arrPtr == nil)
    fmt.Printf("array ptr, %p, %p\n", &arr, arrPtr)
    arr[0] = 3
    // 不能操作数组空指针
    // arrPtr[1] = 9
    fmt.Println(arr, arrPtr)

    var sli []int
    fmt.Println("slice 0 value", sli)
    var sliPtr *[]int
    fmt.Println("*slice 0 value", sliPtr, sliPtr == nil)
    fmt.Printf("slice ptr, %p, %p\n", &sli, sliPtr)
    // 不能操作只声明的slice变量,需要make
    // sli[0] = 8
    fmt.Println(sli)

    var mp map[string]int
    fmt.Println("map 0 value", mp)
    var mpPtr *map[string]int
    fmt.Println("*map 0 value", mpPtr, mpPtr == nil)
    fmt.Printf("map ptr, %p, %p\n", &mp, mpPtr)
    // 不能操作只声明的map变量,需要make
    // mp["str"] = 9
    fmt.Println(mp)

    var ts TestStu
    fmt.Println("struct 0 value", ts)
    var tsPtr *TestStu
    fmt.Println("*struct 0 value", tsPtr, tsPtr == nil)
    fmt.Printf("struct ptr, %p, %p\n", &ts, tsPtr)
    ts.X = 10
    // 不能操作只声明的struct指针
    // tsPtr.Y = 11
    fmt.Println(ts, tsPtr)

    var inter interface{}
    fmt.Println("interface 0 value", inter, inter == nil)
    fmt.Printf("interface ptr, %T\n", inter)
    fmt.Println()

    var ch chan int
    fmt.Println("channel 0 value", ch, ch == nil)
    fmt.Printf("channel ptr, %T, %p\n", ch, ch)
    fmt.Println()

    // new操作
    iPtrN := new(int)
    fmt.Println("new int value", iPtrN, *iPtrN, iPtrN == nil)
    fmt.Println()

    iStrN := new(string)
    fmt.Println("new string value", iStrN, *iStrN, iStrN == nil)
    fmt.Println()

    iArrN := new([2]int)
    fmt.Println("new array value", iArrN, *iArrN, iArrN == nil)
    // 可以对new出来array直接使用
    iArrN[1] = 7
    fmt.Println(iArrN)

    iSliN := new([]int)
    fmt.Println("new slice value", iSliN, *iSliN, iSliN == nil)
    // 不能对new出的slice变量直接下标操作
    // iSliN[0] = 0
    fmt.Println()

    iMpN := new(map[string]int)
    fmt.Println("new map value", iMpN, *iMpN, iMpN == nil)
    // 不能对new出的map变量直接下标操作
    // iMpN["str"] = 0
    fmt.Println()

    iStuN := new(TestStu)
    fmt.Println("new struct value", iStuN, *iStuN, iStuN == nil)
    // 可以对new出的stuct直接使用,与var ts TestStu等效
    iStuN.X = 1
    fmt.Println(iStuN)

    iInterN := new(interface{})
    fmt.Println("new interface value", iInterN, *iInterN, iInterN == nil, *iInterN == nil)

    /*
        golang的零值管理相对比较乱
        使用场景中,我们应该对不同的类型进行区分使用
        基础类型可以直接声明变量,如:var x int,var s string,变量会被初始化为零值变量
        结构体类型可以直接声明变量或使用new操作,如:var stu Struct,new(Struct),变量会被初始化成零值对象
        slice,map类型需要使用make来初始化
    */
}
499689317 commented 2 years ago
Test Go Main
int 0 value 0
*int 0 value <nil> true
int ptr, 0x1400012c008, 0x0

string 0 value 
*string 0 value <nil> true
string ptr, 0x14000110210, 0x0

array 0 value [0 0]
*array 0 value <nil> true
array ptr, 0x1400012c020, 0x0
[3 0] <nil>
slice 0 value []
*slice 0 value <nil> true
slice ptr, 0x1400011e018, 0x0
[]
map 0 value map[]
*map 0 value <nil> true
map ptr, 0x14000126020, 0x0
map[]
struct 0 value {0 0}
*struct 0 value <nil> true
struct ptr, 0x1400012c050, 0x0
{10 0} <nil>
interface 0 value <nil> true
interface ptr, <nil>

channel 0 value <nil> true
channel ptr, chan int, 0x0

new int value 0x1400012c080 0 false

new string value 0x14000110220  false

new array value &[0 0] [0 0] false
&[0 7]
new slice value &[] [] false

new map value &map[] map[] false

new struct value &{0 0} {0 0} false
&{1 0}
new interface value 0x14000110230 <nil> false true