Go语言学习草稿(2) 控制语句 数组 切片

package main

import "fmt"

// 标题: 控制语句和数组

func main() {
	// if 语句
	age := 19
	if age > 18 {
		fmt.Println("成年人")
	} else {
		fmt.Println("未成年人")
	}
	if year := 2020; year > 2000 { // 变量定义和比较放在一行
		fmt.Println("21世纪")
	} else {
		fmt.Println("活在历史中")
	}
	// for 循环
	for i := 0; i < 10; i++ {
		fmt.Print(i)
	}
	var j int32 = 0
	for ; j < 10; j++ {
		if j > 4 {
			break
		} else if j > 3 {
			continue
		}
		fmt.Print(j)
	}
	// foreach 循环
	for i, c := range "我爱你中国" {
		fmt.Printf("%d, %c", i, c)
	}
	// switch 不用写 break
	finger := 5
	switch finger {
	case 0:
		fmt.Println("0")
	case 1:
		fmt.Println("1")
	case 2, 5, 8:
		fmt.Println("您好")
		fallthrough // 继续执行default
	default:
		fmt.Println("**")
	}
	// goto 语句, 一般用于退出多层循环
tag1:
	var i int = 5
	if i > 6 {
		goto tag1
	}
	// 运算符跟C语言完全一致

	// 数组
	var arr1 = [3]int{1, 2, 3} // 数组长度不能变
	var arr2 [3]bool // 都是默认值false
	var arr3 = [...]int{7, 7, 7} // 根据数组长度自动推断(定长)
	var arr4 = []int{7, 7, 7}    // 根据数组长度自动推断(非定长, 所以其实创建的是切片而非数组)
	var arr5 = [10]int{1, 2}  // 长度为10, 只指定两个值, 后面都是默认值0
	var arr6 = [10]int{0: 100, 3: 20} // 根据索引初始化, 其它默认

	for i := 0; i < len(arr6); i++ {
		fmt.Println(arr6[i])
	}

	// 二维数组
	var arr7 [3][2]int
	arr7 = [3][2]int{[2]int{1, 3}, [2]int{9, 8}}
	for _, ints := range arr7 {
		for _, v := range ints {
			fmt.Println(v)
		}
	}
	// 数组是值类型, 深拷贝.
	// 切片是引用类型, 浅拷贝. 切片是不指定长度的数组
	var s1 []int // 定义int类型的切片.
	var s2 = []string{"北京", "上海", "广州"}
	var s3 = arr6[:] // 中括号就是切片操作, 返回的类型是切片
	fmt.Println(s1 == nil) // true. 没有开辟内存空间
	fmt.Println(s2 == nil) // false
	// 长度和容量.
	fmt.Printf("len(s2):%d\tcap(s2):%d\n", len(s2), cap(s2)) // len=3,cap=3
	// 容量是第0个元素到底层数组结尾的容量
	s3 := s2[0:2]
	fmt.Printf("len(s3):%d\tcap(s3):%d\n", len(s3), cap(s3)) // len=2,cap=3
	_ = cap(s2[1:]) // 结果是2

	s1 := make([]int, 5, 10)  // 创建切片slice, 长度=5, 容量=10
	s1 = append(s1, 999, 888) // append and assign. append太多次数容量会+100%或者+25%
	fmt.Println(s1)           // 输出[0 0 0 0 0 999 888]

	// 切片复制
	var s2 = make([]int, 3, 3)
	copy(s2, s1) // 深拷贝. 只拷贝s2能存下的部分.
	s2[0] = 777 // s1不会变
	fmt.Printf("%v, len=%v, cap=%v\n", s2, len(s2), cap(s2)) // [777 0 0], len=3, cap=3

	// 排序
	sort.Ints(s2)
	fmt.Printf("%v\n", s2, len(s2), cap(s2)) // [0 0 777], len=3, cap=3
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值