package main
import"fmt"funcmain(){var x int32// 默认赋值为空
fmt.Println(x)}
publicstaticvoidmain(String[] args){int x =1;// int x会报错System.out.println(x);// 局部变量必须赋值才能使用}
1.2 golang中实现生产者消费者模型,利用管道进行数据通信
package main
import"fmt"// 消费者线程funcconsumer(data chanint, done chanbool){for x :=range data {
fmt.Println("rev", x)}
done <-true}// 生产者线程funcprovider(data chanint){for i :=0; i <4; i++{
data <- i
}close(data)// 关闭管道}funcmain(){
done :=make(chanbool)// 管道、map、slice用make返回本身,如果使用new会返回指针
data :=make(chanint)goconsumer(data, done)goprovider(data)<- done // 阻塞直到消费者发回结束信息}
第二章 类型
2.1 类型推断的使用注意
funcmain(){
x :=100
x, y :=10,5// 这里x会退化为赋值操作,仅y为变量定义, 注意:如果仅使用x := 10会不成功,必须跟至少一个未赋值的变量}
2.2 常量与变量的区别
funcmain(){const x =1// 不使用x的话这样不会报错, 而var x = 2, 不使用x的话会报错}
2.3 常量的值类型省略
funcmain(){const(
x =1
y
z
m
)
fmt.Println(m)// 这里的m的值和类型会根据x的值和类型进行推断}
2.4 go的枚举
// golang虽然没有明确意义上的enum定义,但是可以借助iotaconst(
x =iota// 0
y // 1
z // 2)// 利用_忽略首个0值,并分组赋值const(_,_=iota,iota*10// 0, 0 * 10
a, b // 1, 1 * 10
c, d // 2, 2 * 10)// 如果在枚举的过程中想要中断自增const(
a =iota// 0
b // 1
c =100// 100
d // 100
e =iota// 4 这里会恢复赋值,且c、d被记入计数
f // 5)// 切换iota的类型const(
a =iota// 且iota值默认为int,若想切换类型需要显示指定类型
b float32=iota// float32 1
c =iota// float32 2)
2.5 常量和变量到底有什么区别
var z =0x100const y =0x200funcmain(){
fmt.Println(&z, z)// 不会报错
fmt.Println(&y, y)// 报错,常量不能进行取值,常量会在被编译器在预处理阶段直接展开,作为指令数据使用,类似于java的常量池,所以无法像变量那样通过内存寻址来取值}
// 常量的两种状态对编译器的影响const x =100const y byte= x
const a int=100const b byte= a // 报错,因为上一步显示指定常量类型,编译器会做强类型检查