golang-阅读雨痕大神的Go语言学习笔记的心得

golang-阅读雨痕大神的Go语言学习笔记的心得

  • 第一章 概述
    • 1.1 go与java中的局部变量初始化问题
    • 1.2 golang中实现生产者消费者模型,利用管道进行数据通信
  • 第二章 类型
    • 2.1 类型推断的使用注意
    • 2.2 常量与变量的区别
    • 2.3 常量的值类型省略
    • 2.4 go的枚举
    • 2.5 常量和变量到底有什么区别
    • 2.6 go 基本类型
    • 2.7 go 引用类型
      • 2.7.1 go中new与make的区别

第一章 概述

1.1 go与java中的局部变量初始化问题

package main
import "fmt"

func main() {
	var x int32  // 默认赋值为空
	fmt.Println(x)
}
public static void main(String[] args) {
	int x = 1;  // int x会报错
	System.out.println(x);  // 局部变量必须赋值才能使用
}

1.2 golang中实现生产者消费者模型,利用管道进行数据通信

package main

import "fmt"

// 消费者线程
func consumer(data chan int, done chan bool) {
	for x := range data {
		fmt.Println("rev", x)
	}
	done <- true
}

// 生产者线程
func provider(data chan int) {
	for i := 0; i < 4; i++ {
		data <- i
	}
	close(data) // 关闭管道
}

func main() {
	done := make(chan bool)  // 管道、map、slice用make返回本身,如果使用new会返回指针
	data := make(chan int)

	go consumer(data, done)
	go provider(data)

	<- done // 阻塞直到消费者发回结束信息
}

第二章 类型

2.1 类型推断的使用注意

func main() {
	x := 100 
	x, y := 10, 5 // 这里x会退化为赋值操作,仅y为变量定义, 注意:如果仅使用x := 10会不成功,必须跟至少一个未赋值的变量
}

2.2 常量与变量的区别

func main() {
	const x = 1 // 不使用x的话这样不会报错, 而var x = 2, 不使用x的话会报错
}

2.3 常量的值类型省略

func main() {
	const (
		x = 1
		y
		z
		m
	)
	fmt.Println(m) // 这里的m的值和类型会根据x的值和类型进行推断
}

2.4 go的枚举

// golang虽然没有明确意义上的enum定义,但是可以借助iota
const (
	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 = 0x100

const y = 0x200

func main() {
	fmt.Println(&z, z) // 不会报错
	fmt.Println(&y, y) // 报错,常量不能进行取值,常量会在被编译器在预处理阶段直接展开,作为指令数据使用,类似于java的常量池,所以无法像变量那样通过内存寻址来取值
}
// 常量的两种状态对编译器的影响
const x = 100
const y byte = x

const a int = 100
const b byte = a // 报错,因为上一步显示指定常量类型,编译器会做强类型检查

2.6 go 基本类型

golang-阅读雨痕大神的Go语言学习笔记的心得_第1张图片

2.7 go 引用类型

所谓引用类型特指slice、map、channel这三种预定义类型

2.7.1 go中new与make的区别

new按照指定类型长度分配零值内存,返回指针,并不关心内部构造和初始化方式。
而引用类型必须由make函数进行创建,编译器会将make转换为目标类型专用的创建函数,以确保完成全部内存分配和相关属性初始化。
type Point struct {
	x int
	y int
}

func main() {
	var	*p Point
	p = new(Point) // new会返回指针
	
}

func main() {
	tempMap := make(map[string]int). // 引用对象只能由make进行创建
}

你可能感兴趣的:(golang学习之旅,go)