golang[3]-变量声明与赋值

变量

变量是内存当中一段空间的抽象描述。变量的类型明确了空间的大小以及空间如何解析。

Go中的变量类型

1
bool byte complex64 complex128 error float32 float64 int int8 int16 int32 int64 rune string uint uint8 uint16 uint32 uint64 uintptr

变量的声明与赋值

方式1

1
2
3
4
5
6
7
8
9
package main

import "fmt"

func main() {
  var x string
  x = "Hello World"
  fmt.Println(x)
}

方式2

注意,x := “Hello World” 等价于 var x = “Hello World”
自动推断类型,并且必须在函数体内部

1
2
3
4
5
6
7
8
package main

import "fmt"

func main() {
  x := 1
  fmt.Println(x)
}

多样的赋值

1
2
3
4
5
6
7
8
var i int
var U, V, W float64
var k = 0
var x, y float32 = -1, -2
var (
	i       int
	u, v, s = 2.0, 3.0, "bar"
)

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package main

import "fmt"

func main(){

	var a,b string= "jonson","jackson"

	c,d := true,false

	e,f,g := "jonson",true,123
	fmt.Println("a:",a)
	fmt.Println("b:",b)

	fmt.Println("c:",c)
	fmt.Println("d:",d)

	fmt.Println("e:",e)
	fmt.Println("f:",f)
	fmt.Println("g:",g)
}

零值问题

变量初始化不赋值的情况,默认为空。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
import "fmt"
func main() {
	var a int
	var b string
	var c float64
	var d bool

	fmt.Printf("%v \n", a)
	fmt.Printf("%v \n", b)
	fmt.Printf("%v \n", c)
	fmt.Printf("%v \n", d)
	fmt.Println()
}

常量

常量一旦声明不能改变,并且常量必须赋予初始值。此代码无效func main() {const x int}

有效:

1
2
3
4
5
6
7
8
9
10
11
package main


const (
	m  =  1
	n  =  2
)
func main(){

  const k = 8
}

iota 使用

iota从0开始循环

1
2
3
4
5
6
7
8
9
10
11
12
13
const (
    a = iota
    b = iota
    c = iota
    d = iota
)
等价于:
const (
    a = iota
    b
    c
    d
)

使用案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package main

import "fmt"

func main() {
	const (
		a = iota   //0
		b          //1
		c          //2
		d = "ha"   //独立值,iota += 1
		e          //"ha"   iota += 1
		f = 100    //iota +=1
		g          //100  iota +=1
		h = iota   //7,恢复计数
		i          //8
	)
	fmt.Println(a,b,c,d,e,f,g,h,i)
}

变态iota

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import "fmt"
const (
    i=1<<iota
    j=3<<iota
    k
    l
)

func main() {
    fmt.Println("i=",i)
    fmt.Println("j=",j)
    fmt.Println("k=",k)
    fmt.Println("l=",l)
}

结果:

1
2
3
4
i= 1
j= 6
k= 12
l= 24

iota表示从0开始自动加1,所以 i=1<<0, j=3<<1(<<表示左移的意思),即:i=1,j=6,这没问题,关键在k和l,从输出结果看 k=3<<2,l=3<<3。
简单表述:
• i=1:左移 0 位,不变仍为 1;
• j=3:左移 1 位,变为二进制 110, 即 6;
• k=3:左移 2 位,变为二进制 1100, 即 12;
• l=3:左移 3 位,变为二进制 11000,即 24。

郑建勋(jonson)区块链工程师 & Web工程师

灾难总是接踵而至,这正是世间的常理。你以为只要哭诉一下,就会有谁来救你吗?如果失败了,就只能说明我不过是如此程度的男人。

发布了59 篇原创文章 · 获赞 0 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weishixianglian/article/details/84261670