**** 理解切片

è¿éåå¾çæè¿°

ptr指向了一块内存区域 大小是cap  实际存放的内容大小是len  每次执行切片后相当于存放了一个指向该位置的索引结构 故修改值会相互影响 是一种引用

在创建数组时没有指定大小即是创建切片 。或者声明了一个数组后 从数组中再进行切片

*** 变参

func addandsub(a int, b int) (int, int){
	return a + b , a - b
}

func addarray(nums ...int) int  {
	ret := 0
	for _, num := range nums{
		ret += num
	}
	return ret
}
func main() {
	res1, res2 := addandsub(1,2)
	fmt.Println(res1, res2)
	a := [4]int{1,2,3,4}
	fmt.Println(addarray(a[:]...))
}

当使用slice传入时使用...展开

*** 结构体定义

type Student struct {
	age int
	name string
}

有struct 和interface 两种

定义属于结构体的方法

func (s *Student) change(newage int){
	s.age = newage
}
func (s Student) printAge(){
	fmt.Println(s.age)
}
func main() {
	stu1 := Student{20,"sihao"}
	stu1.change(27)
	fmt.Println(stu1.age)
	stu1.printAge()
}

golang 会自动判断当为指针时 自动使用(*p).func或者(*p).name (加上这个特性不就相当于引用了?)

 

** 对unicode字符集的特殊处理   rune

func main() {
	s := "nihao 你好"
	// rune代表一个真正意义上的字符(特别是在unicode中) 使用len得到的是字符数组
	fmt.Println(len(s), len([]rune(s)))
}