golang:各种类型的变量直接存储的是什么

golang:各种类型的变量直接存储的是什么,第1张

1. integer、float、bool、string类
func main() {
    var (
        a = 1
        b = "hello"
        c = false
        d = 1.22
    )
	fmt.Printf("a以值打印\t%v\n", a)
    fmt.Printf("a以指针打印\t%p\n", a)
    
    fmt.Printf("b以值打印\t%v\n", b)
    fmt.Printf("b以指针打印\t%p\n", b)
    
    fmt.Printf("c以值打印\t%v\n", c)
    fmt.Printf("c以指针打印\t%p\n", c)
    
    fmt.Printf("d以值打印\t%v\n", d)
    fmt.Printf("d以指针打印\t%p\n", d)
}

// 输出
a以值打印	1
a以指针打印	%!p(int=1)

b以值打印	hello
b以指针打印	%!p(string=hello)

c以值打印	false
c以指针打印	%!p(bool=false)

d以值打印	1.22
d以指针打印	%!p(float64=1.22)

可见,这些量存储的都是值,不是指针

2. 数组、结构体

结构体

type Test struct{
    a int
}

func main() {
    var (
        a Test
        b = Test{}
        c = Test{a:1}
    )
	fmt.Printf("a以值打印\t%v\n", a)
    fmt.Printf("a以指针打印\t%p\n", a)
    
    fmt.Printf("b以值打印\t%v\n", b)
    fmt.Printf("b以指针打印\t%p\n", b)
    
    fmt.Printf("c以值打印\t%v\n", c)
    fmt.Printf("c以指针打印\t%p\n", c)
}
// 输出
a以值打印	{0}
a以指针打印	%!p(main.Test={0})

b以值打印	{0}
b以指针打印	%!p(main.Test={0})

c以值打印	{1}
c以指针打印	%!p(main.Test={1})

数组

func main() {
    var (
        d [2]int
        e = [2]int{}
        f = [2]int{1,2}
    )
    fmt.Printf("d以值打印\t%v\n", d)
    fmt.Printf("d以指针打印\t%p\n", d)
    
    fmt.Printf("e以值打印\t%v\n", e)
    fmt.Printf("e以指针打印\t%p\n", e)
    
    fmt.Printf("f以值打印\t%v\n", f)
    fmt.Printf("f以指针打印\t%p\n", f)
}

// 输出
d以值打印	[0 0]
d以指针打印	%!p([2]int=[0 0])

e以值打印	[0 0]
e以指针打印	%!p([2]int=[0 0])

f以值打印	[1 2]
f以指针打印	%!p([2]int=[1 2])

可见,数组和结构体存储的都是值,是类型实体对象

3. Map、Slice、Channel、指针
func main() {
    var (
        a []int
        b map[int]int
        c chan int
        d = []int{1,2}
        e = map[int]int{0:1,1:2}
        f = make(chan int,1)
    )
	fmt.Printf("a以值打印\t%v\n", a)
    fmt.Printf("a以指针打印\t%p\n", a)
    
    fmt.Printf("b以值打印\t%v\n", b)
    fmt.Printf("b以指针打印\t%p\n", b)
    
    fmt.Printf("c以值打印\t%v\n", c)
    fmt.Printf("c以指针打印\t%p\n", c)
    
    fmt.Printf("d以值打印\t%v\n", d)
    fmt.Printf("d以指针打印\t%p\n", d)
    
    fmt.Printf("e以值打印\t%v\n", e)
    fmt.Printf("e以指针打印\t%p\n", e)
    
    fmt.Printf("f以值打印\t%v\n", f)
    fmt.Printf("f以指针打印\t%p\n", f)
}
// 输出
a以值打印	[]
a以指针打印	0x0   // nil

b以值打印	map[]
b以指针打印	0x0   // nil

c以值打印	
c以指针打印	0x0   // nil

d以值打印	[1 2]
d以指针打印	0xc00001a040

e以值打印	map[0:1 1:2]
e以指针打印	0xc000052150

f以值打印	0xc000046070
f以指针打印	0xc000046070

可见,map、channel、slice存的都是指针,未初始化时它们都是nil

4. 总结

值类型变量存储的都是值,引用类型变量存储的都是指针

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/990682.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存