go - 03 基础语法(持续更新)

本文深入解析Go语言的基本语法,包括标识符、数据类型、常量与变量声明、函数、流程控制、数组与切片、映射和结构体等核心概念。通过详细示例,帮助读者快速掌握Go语言编程的基础。

基本语法

标识符

由一个或是多个字母、数字、下划线组成,不能以数字开头。

行分隔符

一行代表一个语句结束,行尾不需要分号,(多个语句写在一行时需要用分号进行隔开)

注释

// 单行注释
/*
  多行注释
*/

package

一个可执行go程序只有一个main包, main package中的go程序文件直接存放在工程根目录。其他package下的程序文件存放在根目录下package对应的目录中。

package main

导包

import可以导入其他非main包,格式:[项目名/]包名

//单行导入
import "fmt"
//多行导入
import (
 "fmt"
 "os/user"
 "unsafe"
)

数据类型

声明举例类型说明
bbool//布尔型,默认值为false
_strstring//字符串
_bytebyte//类似uint8
_runerune//类似uint32
_uintuint//32位或者64位
_intint//与uint一样大小
_uintptruintptr//无符号整形,用于存放指针
_uint8uint8//无符号 8 位整型 (0 到 255)
_uint16uint16//无符号 16 位整型 (0 到 65535)
_uint32uint32//无符号 32 位整型 (0 到 4294967295)
_uint64uint64//无符号 64 位整型 (0 到 18446744073709551615)
_int8int8//有符号 8 位整型 (-128 到 127)
_int16int16//有符号 16 位整型 (-32768 到 32767)
_int32int32//有符号 32 位整型 (-2147483648 到 2147483647)
_int64int64//有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
f32float32//32位浮点型数
f64float64//64位浮点型数
comp64complex64//32位实数和虚数
comp128complex128//62位实数和虚数

常量声明

//单个声明
const KEY string = "hello.key"

//一次多个常量声明
const (
 PI      = 3.14 //类型可以省略。go会从右侧变量自动推断
 ENABLED = false
 a       = "abc"
 alen 	 = len(a) 	//常量可以用内置函数计算表达式的值。
 c       = unsafe.Sizeof(a)
)

iota,特殊常量,随代码执行顺序递增

const (
 i = iota * 2 //iota = 0 , i = 0*0 = 0
 j = iota * 2 //iota = 1 , j = 1*2 = 2
 k            //等效于“k = iota*2”,与上一行右侧表达式一致情况下可省略 
 m = "hello"  //iota += 1
 n            //iota = 4 , n="hello"
 x = iota     //iota = 5 , x = 5
 y            //iota = 6 , y = 6
)

全局变量

//全局变量
var name = "TOM"
var i1, i2, isOk = 1, 2, false

//多个全局变量
var (
	str  string    //未赋值时必须声明数据类型
	str1 = "world" //声明时就赋值则不需要声明数据类型,go会自动从右侧进行推断
)

局部变量声明

func hellogo() {
	var stuNo int    //一般类型声明
	stuName := "JIM" //简短声明(只能在方法体中使用简短声明)
	stuNo = 1001     //变量赋值操作

	//一次声明多个变量
	var enabled, disabled = true, false
	stuAge, StuAddress := 15, "湖北省武汉市"

	fmt.Println(stuName, stuNo)
	fmt.Println(enabled, disabled)
	fmt.Println(stuAge, StuAddress)
}

函数声明

//首字母大写 声明public类型的函数
func PublicFunc() {
	//全局的public函数也是go的export函数,导出函数应该有相应的注释。
}
//首字母小写表示函数为private
func privateFunc() {
	//
}

main函数

//main函数是go程序的入口
func main() {
	fmt.Println("main 函数开始执行...")
}

init函数

package中的init函数在package被导入时自动执行,可以在其中执行package中定义的变量。init函数可以定义多个,多个init函数执行时无先后顺序。(可以按照java中的static块来理解)

func init() {
	fmt.Println("init 11")
}
func init() {
	fmt.Println("init 22")
}

struct定义与声明

type MyStruct struct{
  Name string 
  //匿名struct
  Desc struct{
    ID int
    DescStr string
  }
}
func print(){
  ms := MyStruct{}
  fmt.Println("%v",ms)
  ms1 := struct{
    Name string
    age int
  }{"Tom",25}
  fmt.Printf("%v",ms1)
}

interface定义与声明

//接口定义
type MyInterface interface{
  //接口方法
  Fn()
}

//实现类定义
type MyImpls struct{}
//实现接口中的函数
func (impl *MyImpls) Fn() {
	//do something
}

func Test(impl MyInterface) {
	impl.Fn()
}
func main() {
	impl := MyImpls{}
	Test(&impl)
}

if…case

x := "test"
if x == "test" {
	fmt.Println("x is test")
}

if x == "1" {

} else if x == "test" {

} else {

}

switch…case

sex := "M"
switch sex {
case "M":
	fmt.Println("man")
case "F":
	fmt.Println("woman")
	break
default:
	fmt.Println("no match")
}

go中的case子句会自动跳出,不需要显示使用break。增加break和不增加break效果一致

for循环

for index, count := 0, 3; index < count; index++ {
	fmt.Printf("第%d次循环", index)
	fmt.Println()
}

num := 1
for {
	switch num {
	case 1:
		fmt.Println("case1 执行")
		break 	//只会跳出case子句,不会跳出for循环
	case 2:
		fmt.Println("case2 执行")
	}
	break		//会跳出for循环
}

nums := [1,2,3,4,5]
for i,v := range nums{
  fmt.Printf("nums[%d]:%f\n", i, v)
}

Slice(切片/数组)

var arys [5]int  						//声明切片
fmt.Println(arys)
nums := make([]float32, 3)  //利用make函数声明切片
nums1 := []int{1, 2, 3} 		//利用字面常量声明切片 

字符串

	//定义字符串
	str := "hello world !"
	//前缀判断
	res := strings.HasPrefix(str, "hello")
	//后缀判断
	res := strings.HasSuffix(str, "!")
	//遍历字符串,i为字符下标
	for i, s := range ary {
		fmt.Printf("%d:%s\n", i, s)
	}
	//拆分为数组
	ary = strings.Split(str, "l")

Map

func mapDemo() {

	week := map[int]string{
		1: "张三",
		2: "李四",
		3: "小明",
		4: "老王",
		5: "二蛋",
		6: "玲玲",
		7: "费邪",
	}

	fmt.Printf("原始map:%v\n", week)
	keys := make([]int, len(week))
	i := 0
	for k := range week {
		keys[i] = k
		i++
	}
	sort.Ints(keys)
	for _, k := range keys {
		fmt.Printf("key:%d,val:%s", k, week[k])
	}
}

List

type student struct {
	stuNo   int
	stuName string
}
func (ptr student) String() string {
	return fmt.Sprintf("{stuNo:%d,stuName:%s}", ptr.stuNo, ptr.stuName)
}
func listDemo() {
	list := list.New()
	list.PushBack(101)
	list.PushBack("102")
	list.PushBack(103)

	stu := new(student)
	stu.stuNo = 100
	stu.stuName = "校长"

	var stu1 student
	stu1.stuNo = 24
	stu1.stuName = "老王"

	list.PushBack(stu)
	for e := list.Front(); e != nil; e = e.Next() {
		fmt.Println(e.Value)
	}
	fmt.Println(stu1)
	fmt.Println(stu)
	fmt.Println(list)
}

Stack

func structDemo() {
	sta := new(stack.Stack)
	sta.Cap = 5

	sta.Push(19)
	sta.Push(12)
	sta.Push(13)
	fmt.Println(sta.Pop())
	fmt.Println(sta)
	sta.Push(188)
	fmt.Println(sta)
}

本课题设计了一种利用Matlab平台开发的植物叶片健康状态识别方案,重点融合了色彩与纹理双重特征以实现对叶片病害的自动化判别。该系统构建了直观的图形操作界面,便于用户提交叶片影像并快速获得分析结论。Matlab作为具备高效数值计算与数据处理能力的工具,在图像分析与模式分类领域应用广泛,本项目正是借助其功能解决农业病害监测的实际问题。 在色彩特征分析方面,叶片影像的颜色分布常与其生理状态密切相关。通常,健康的叶片呈现绿色,而出现黄化、褐变等异常色彩往往指示病害或虫害的发生。Matlab提供了一系列图像处理函数,例如可通过色彩空间转换与直方图统计来量化颜色属性。通过计算各颜色通道的统计参数(如均值、标准差及主成分等),能够提取具有判别力的色彩特征,从而为不同病害类别的区分提供依据。 纹理特征则用于描述叶片表面的微观结构与形态变化,如病斑、皱缩或裂纹等。Matlab中的灰度共生矩阵计算函数可用于提取对比度、均匀性、相关性等纹理指标。此外,局部二值模式与Gabor滤波等方法也能从多尺度刻画纹理细节,进一步增强病害识别的鲁棒性。 系统的人机交互界面基于Matlab的图形用户界面开发环境实现。用户可通过该界面上传待检图像,系统将自动执行图像预处理、特征抽取与分类判断。采用的分类模型包括支持向量机、决策树等机器学习方法,通过对已标注样本的训练,模型能够依据新图像的特征向量预测其所属的病害类别。 此类课题设计有助于深化对Matlab编程、图像处理技术与模式识别原理的理解。通过完整实现从特征提取到分类决策的流程,学生能够将理论知识与实际应用相结合,提升解决复杂工程问题的能力。总体而言,该叶片病害检测系统涵盖了图像分析、特征融合、分类算法及界面开发等多个技术环节,为学习与掌握基于Matlab的智能检测技术提供了综合性实践案例。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值