01 go基础语法

1、定义var关键字:

(1)var a,b,c bool
(2)var aa,bb string = “hello”,“world”
(3)可放在函数内,或直接放在包内。
(4)函数内使用案例(可使用 : 替代定义变量,但只能在函数内使用):

package main
import "fmt"
func funOne()  {
	//: 等于 var
	a,b,c,d,e := 1,2,true,"qwe",3
	b = 10	// 给b重新赋值
	fmt.Println(a,b,c,d,e)
}
func main() {
	funOne()
}

(5)包内使用案例(可使用var()集中定义变量):包内指package(package main),相当于函数外。

var qq = true    
var (
	aa = 1
	ss = "qqq"
	bb = false
)

2、内建变量类型:

(1)bool,string
(2)整数类型:(u)int,(u)int8,(u)int16,(u)int32,(u)int64,uintptr
	加u无符号整数。不加u有符号整数。
	有符号整数分两类:规定符号长度(如:int8,int16...)和不规定长度。
	uintptr:无符号整型,用于存放一个指针。
(3)byte,rune
(4)float32,float64,complex64,complex128	
详见:https://www.runoob.com/go/go-data-types.html

3、强制类型转换(类型转换是强制的)

func triangle()  {
	var a,b int = 3,4
	var c int
	c = int(math.Sqrt(float64(a*a + b*b)))
	fmt.Println(c)	// 5
}

4、常量与枚举

(1)常量的定义(const 数值可作为各种类型使用):

func consts()  {
	const (
		name = "lili"
		a,b = 6,1
	)
	var c int
	c = int(math.Sqrt(a*a + b*b))
	fmt.Println(c)	// 6
}

(2)枚举类型:

// 普通枚举类型:
	func enums()  {
		const (
			cpp = iota
			java
			python
		)
		fmt.Println(cpp,java,python)	// 0 1 2 
	}
	
// 自增值枚举类型(iota):
	func enums()  {
		// iota 自增值
		// _ 可以理解为占位
		const (
			cpp = iota
			_
			python
			golang
			javascript
		)
		const (
			b = 1<<(10*iota)
			c
			d
			e
		)
		fmt.Println(cpp,python,golang,javascript)	// 0 2 3 4
		fmt.Println(b,c,d,e)	// 1 1024 1048576 1073741824
	}

(3)定义要点:

  • 变量类型写在变量名之后。
  • 编译器可推测变量类型。
  • 没有char,只有rune。
  • 原生支持复数类型。

5 条件语句

(1) if 条件语句。

  • if判断条件是不需要放到括号里的。
  • if 的条件里可以赋值。
  • if 的条件里赋值的变量作用域就在这个if语句里。
  • if 条件里也可定义变量。
func iffunmain() {
	const filename = "abc.txt";
	// 第一种写法
	contents,err := ioutil.ReadFile(filename)
	if err != nil {
		fmt.Println(err)
	}else {
		fmt.Printf("%s\n",contents)
	}
	//第二种写法—— 简写if语句:
	if contents,err := ioutil.ReadFile(filename) ; err != nil {
		fmt.Println(err)
	}else {
		fmt.Printf("%s\n",contents)
	}
}
func main() {
	iffunmain(); 
	/*  结果:
		同级目录未建abc.txt文件报:open abc.txt: no such file or directory
		已建abc.txt文件,会读取文件里的内容。如:找到abc.txt文件!啦啦啦
	*/
}

(2)switch 条件语句。

  • switch 语句的不同的 case 之间不使用 break 分隔,默认只会执行一个 case。
  • 如果我们需要执行后面的 case,可以使用 fallthrough 关键字:
    使用 fallthrough 会强制执行后面的 case 语句,fallthrough 不会判断下一条 case 的表达式结果是否为 true。
  • switch 后可以没有表达式,在case 后加上条件语句也可以。
  • switch 不需要break,也可以直接switch多个条件。
func switchfun(score int) string {
	g :=""
	switch {
	case score < 0 || score > 100 :
		panic( fmt.Sprintf("没有匹配项:%d",score))
	case score < 60 :
		g ="F"
	case score <= 100 :
		g ="A"
	}
	return g
}
func main() {
	fmt.Println(		
		switchfun(0),	// F
		switchfun(59),	// F 
		switchfun(100),	// A
	)
}

6、循环

(1)for 循环语句。

  • for的条件里不需要括号。
  • for的条件里可以省略初始条件,结束条件,递增表达式。
func convertToBin(n int) string {  // 整数转为二进制。
   	result := ""
   	for ; n>0; n/=2 {
   		lsb := n%2
   		result = strconv.Itoa(lsb)+result
   	}
   	return  result
   }
	func main() {
		fmt.Println(
			convertToBin(5),		// 101
			convertToBin(13),	// 1101
		)
	}


   func printFile(filename string)  {
   	file, err := os.Open(filename);	  // Open打开一个文件用于读取
   	if err != nil {
   		panic(err)
   	}
   	scanner := bufio.NewScanner(file)
   	for scanner.Scan(){
   		fmt.Println(scanner.Text())
   	}
  }
	func main() {
		printFile("abc.txt")	// 找到abc.txt文件!啦啦啦
	}

   // 死循环:结果会一直打印 "abc"
   func forever()  {
   	for  {
   		fmt.Println("abc")
   	}
   }

7、函数

  • 返回值类型写在最后面。
  • 可返回多个值。
  • 函数作为参数。
  • 没有默认参数,可选参数。
func eval(a,b int, op string) (int,error) {
   	switch op {
   	case "+":
   		return a+b, nil
   	case "-":
   		return a-b, nil
   	case "*":
   		return a*b, nil
   	case "/":
   		q,_ := div(a,b)
   		return q, nil
   	default:
   		return 0,fmt.Errorf(
   			"报错: %s",op )
   	}
   }
   func main() {
	if result, err := eval(3,4,"X");err != nil {
		fmt.Println("Error:",err)
	}else {
		fmt.Println(result)
	}		// Error: 报错: X
   }
/*
   	返回两个或多个值。例:13 / 4 = 4 ...1
   	返回多个值时可以起名称
   	仅用于非常简单的函数
   	起什么名称,对调用者而言没有区别
   */
   func div(a,b int) (int,int) {
   	return a/b, a%b
   }
   func main() {
	a,b := div(13,3)
	fmt.Println(a,b)	// 4 1
   }
 /*
   	例:op是个函数,有两个参数,返回是int类型
   */
   func apply(op func(int,int) int,a,b int) int {
   	p := reflect.ValueOf(op).Pointer()
   	opName := runtime.FuncForPC(p).Name()
   	fmt.Printf("打印op函数 %s"+"(%d %d)",opName,a,b)
   	return op(a,b)
   }
   func main() {
	fmt.Println(apply(
		func(a int, b int) int {
			return int(math.Pow(
				float64(a),float64(b)))
		},3,4))	// 打印op函数 main.main.func1(3 4)81
   }

8、指针

参数传递:go语言只有值传递一种方式。

	例:互换两个值,需要传指针进去
		func swap(a,b *int)  {
			*a,*b = *b,*a
		}
  • 当一个指针被定义后没有分配到任何变量时,它的值为 nil。
  • nil 指针也称为空指针。
  • nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。
 // 第一种写法:
   func swap(a,b *int)  {
   	*a,*b = *b,*a
   }
   func main(){
	a,b := 3,4
   	swap(&a,&b)
   	fmt.Println(a,b)	// 4 3
   }
   // 第二种写法:简化
   func swap(a,b int) (int,int) {
   	return b,a
   }
   func main() {
	a,b := 3,4
	a,b = swap(a,b)
	fmt.Println(a,b)	// 4 3
   }

最近在学某课的Go语言开发课程,为加深记忆,想着在学习的过程中做了一些笔记,不足之处,请各位大佬多多指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值