go语言入门
条件分支
if语句
可以包含初始语句,类似for的初始语句
func main() {
var num int
if num = 4; num < 5 {
num+=2
}else if num<3 {
num+=3
}else {
num+=10
}
fmt.Println(num)
}
func main() {
var num int
// 标识符的重声明 num被再次声明,那么if内部使用的是重声明后的,其他作用域任然使用的是第一次声明的值。
// 在if作用域范围内对num的访问和赋值只会涉及到第二次声明的那个变量num,这种现象叫做标识符的遮蔽
if num := 4; num < 5 {
num+=2
fmt.Println(num)
}else if num<3 {
num+=3
}else {
num+=10
}
fmt.Println(num)
}
switch语句
可以有初始化语句,写法与if一样
switch的每一个case可以携带一个表达式或一个类型说明符
因此存在两种case:表达式switch语句和类型switch语句
表达式switch语句
func main() {
switch name:="djdjdj";name {
case "dj":
fmt.Println("dj")
case "djdjdj":
fmt.Println(name)
default:
fmt.Println("default")
}
}
类型switch语句
interface{}(v).(type)
这种写法是专门使用于switch的类型推断的
func main() {
ia := []interface{}{byte(6), 'a', uint(10), int32(-4)}
switch v := ia[(rand.Intn(4)%2)+1]; interface{}(v).(type) {
case uint, rune:
fmt.Printf("Case A.")
case byte:
fmt.Printf("Case B.")
default:
fmt.Println("Unknown!")
}
//
rand.Seed(time.Now().Unix())
fmt.Println(rand.Intn(4))
}
for语句
for有两种迭代方式,一种于java中的for each类似,还有一种类似于for in,在go中叫range
func main() {
for i:=0; i< 100; i++{
fmt.Println(i)
}
// %d 十进制 %c 字符 %t true false %T 相应值的类型的Go语法表示
var builder string
for i,v:= range "go dj" {
fmt.Println(i)
builder = builder + fmt.Sprintf("%c",v)
}
fmt.Println(builder)
fmt.Printf("%T",builder)
fmt.Println("数组")
var builder2 string
for i,v:= range [...]int{1,2,3,4,5,6} {
fmt.Println(i)
builder2 = builder2 + fmt.Sprintf("%d",v)
}
fmt.Println(builder2)
fmt.Println("字典")
var builder3 string
for i,v:= range map[int]string{1:"dj",2:"cj"} {
fmt.Println(i)
builder3 = builder3 + fmt.Sprintf("%s",v)
}
fmt.Println(builder3)
fmt.Println("通道")
var builder4 string
ch := make(chan int)
go func() {
for i := 0; i < 5; i++ {
ch <- i //往通道写数据
}
//不需要再写数据时,关闭channel
close(ch)
}()
for i:= range ch {
builder4 = builder4 + strconv.Itoa(i)
}
fmt.Println(builder4)
}
for i, v := range "Go语言" {
fmt.Printf("%d: %c\n", i, v)
}
/*
0: G
1: o
2: 语
5: 言
*/
字符串的底层是字节数组,一个中文字符占3个字节
select语句
select只能使用于通道类型的select,对于的操作分别是向通道写值和向通道收值
规则
- 如果有多个case满足条件,伪随机选择一个执行
- 全部不满足执行default,没有default会阻塞至其中一个case满足条件
- break和return语句可以使用于case当中
func main() {
//接收demo
ch1 := make(chan int,5)
ch2 := make(chan int,5)
select {
case c1 :=<- ch1:
fmt.Println(c1)
case c2 := <- ch2:
fmt.Println(c2)
default:
fmt.Printf("nothing happend")
}
go func() {
close(ch1)
close(ch2)
}()
//发送demo
ch3 := make(chan int,2)
ch4 := make(chan int,2)
select {
case ch3 <- 1:
fmt.Println("ch3")
case ch4 <- 2:
fmt.Println("ch4")
default:
fmt.Printf("nothing happend")
}
go func() {
close(ch3)
close(ch4)
}()
}