go学习笔记

基于深度学习的图像配准 基于深度学习的图像配准技术 阅读详情

go语言学习

go语言常见包

在这里插入图片描述

声明变量方式
// 声明变量格式:var 变量名 变量类型


// 批量声明
	var (
		a int
		b string
		c []float32
		d func() bool
		e struct{
			x int
		}
	)

多重复制

// 常见的交换两个值。在排序算法很常见
func main() {
	var a = 100
	var b = 20
	a,b=b,a
	print(a,b)
}

匿名变量

// 匿名变量,匿名变量不占用命名空间,不会分配内存。匿名变量与匿名变量之间也不会因为多次声明而无法使用。
func GetData() (int,int) {
	return 100,2000
}
func main() {
	var a = 1
	_,a=GetData()
	print(a
package main

import "fmt"

// 注意点1: package与 func 要一致
// 注意点2:func main 后面的括号要在同一行
func main() {
	var a int
	//1- 变量声明标准方式
	var name string ="ddd"
	//2- 编译器推导方式
	var age=190
	// 3- 更简洁方式。注意 海象符号不能够声明全局变量。否则抛出异常,并且编译也编译不过去
	weight := 13.3

	fmt.Println("age =",age)
	fmt.Println("weight =",weight)
	fmt.Println("hello go",name)
	fmt.Println(a)
	
	// 声明多个变量(同一种类型)
	var x,y  =100,22
	print("x=",x,",y=", y)
	// 声明多个变量(不同种类型)
	var (
		bol =false
		num =1222
	)
	print("bol=",bol,",num=", num)
}

变量的生命周期

编译器觉得变量应该分配在堆和栈上的原则是:
● 变量是否被取地址。
● 变量是否发生逃逸。


// 声明空结构体测试结构体逃逸情况
type Data struct {
}

func dummy() *Data {
// 通过 go run -gcflags "-m -l" HeapAnalysis.go 分析,可以看到 编译器将c变量的地址,放到了堆中。这句话表示,Go编译器已经确认如果将c变量分配在栈上是无法保证程序最终结果的。如果坚持这样做,dummy()的返回值将是Data结构的一个不可预知的内存地址。这种情况一般是C/C++语言中容易犯错的地方:引用了一个函数局部变量的地址。
	var c Data
	// 返回函数局部变量地址
	return &c
}

func main() {
	fmt.Println(dummy())
}
常量与枚举:const与iota
//const 与iota可以花里胡哨
// 注意:iota必须和const一起
const (
	a,b = iota+1,iota+2
	c,d     // iota =1.依次递增
	e,f
	
	g,h=iota*2,iota*3
	m,n
)

func main() {
	// const 关键字作用一:定义常量
	const legth = 110

	print("length=",legth)


	print("Spring=",SPTING)
}

字符串

获取字符串长度
●ASCII字符串长度使用len()函数。
● Unicode字符串长度使用utf8.RuneCountInString函数。go默认是使用UTF-8编码,一个中文字符占3个

// 1-获取字符串长度
func main() {
	// len函数表示字符串的ASCII编码字符个数或者字节长度
	str :="dddddddd"
	fmt.Println(len(str))
	strC :="中国"
	// 或者使用
	fmt.Printf("个数:%d\n",utf8.RuneCountInString("中国"))
	// 下面打印是6,这是由于go使用的是UTF-8 格式保存,每个中文占用3个字节
	fmt.Println(len(strC))

字符串遍历
总结:
● ASCII字符串遍历直接使用下标。(若有中文出现乱码,fori格式)
● Unicode字符串遍历用for range。

	strC :="中国"
	for _, v := range strC {
		fmt.Printf("%c",v)
	}

字符串搜索和截取

//● strings.Index:正向搜索子字符串。start := strings.Index(str,"d")
//● strings.LastIndex:反向搜索子字符串。lastIndex := strings.LastIndex(str,"d")
//● 搜索的起始位置可以通过切片偏移制作。str[3:]  类似java的 subString()
函数与多返回值
// 关键字 函数名 形参 返回值{函数体}
func funName(param1 type,param2 type) [(int,int)]{
    // 函数体
}



// 函数与多返回值
func fun(a int, name string) {
	println("a=",a,",name=",name)
}

func fun2(a int, name string) (int,int) {
	println("-----fun2------")
	println("a=",a,",name=",name)
	return 100,200
}
func fun3(a int, name string) (re1 int ,ret2 int) {
	println("-----fun2------")
	println("a=",a,",name=",name)
	 re1=100
	 ret2=2000
	return
}
func fun4(a int, name string) (re1  ,ret2 int) {
	println("-----fun2------")
	println("a=",a,",name=",name)
	re1=100
	ret2=2000
	return
}
import与init

这个有点类似,java的多重继承。也是先初始化父类的常量,代码块,然后最后才是当前类。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iaehCK0E-1630501774968)(D:\root\mdPic\image-20210831204942388.png)]

演示一下

目录结构

---src
    main.go
    ---lib1
    	lib1.go
   	---lib2
    	lib2.go
package main

import "5-init/lib1"
import "5-init/lib2"
func main() {
	lib1.Lib1Test()
	lib2.Lib2Test()
}

package lib1

// todo 若 方法首字母小写,代表此方法是私有方法
func Lib1Test() {
	println("lib1.Lib2Test()......")
}

func init() {
	println("lib1.init()......")
}

package lib2

// todo 若 方法首字母小写,代表此方法是私有方法
func Lib2Test() {
	println("lib2.Lib2Test()......")
}

func init() {
	println("lib2.init()......")
}

输出

lib1.init()......
lib2.init()......
lib1.Lib2Test()......
lib2.Lib2Test()......

注意点:

1-导入包,但是不使用,会报错。但是golang IDE,会自动删除

2-支持匿名:

import (
	_ "5-init/lib1"
	"5-init/lib2"
// 你不使用,这个包的init方法会被执行
)

3-支持给包起别名

import (
	_ "5-init/lib1"
	myLib2 "5-init/lib2"

)
指针

● 类型指针,允许对这个指针类型的数据进行修改。传递数据使用指针,而无须拷贝数据。类型指针不能进行偏移和运算。
● 切片,由指向起始元素的原始指针、元素数量和容量组成。

func swap(a int,b int)  {
	var temp int
	temp=a
	a=b
	b=temp
}

func swap2(a *int, b *int) {
	var temp int
	temp =*a
	*a=*b
	*b=temp
}
func main() {
	var a ,b= 10,20
	// 值传递
	//swap(a,b)
	// 指针(引用传递),c好像还分二级指针(本质上就是套娃)
	swap2(&a,&b)
	println("a=",a,",b=",b)
	
	// 二级指针(也可以多级指针)
	var p = &a
	var pp **int= &p
	println("p的地址=",p)
	println("pp地址=",pp)
}

defer关键字

作用:让方法结束之后,调用之,类似于finally以及aop的后置通知

func A()  {
	println("A")
}

func B()  {
	println("B")
}
func C()  {
	println("C")
}
func main() {
	// 这里涉及到 函数出入栈的问题
	defer A()
	defer B()
	defer C()
	println("main() ....end...")
}

结果

main() ....end...
C
B
A

defer 与return一起使用。

func deferCall() {
	println("deferCall-----")
}
func returnCall() int {
	println("returnCall........")
	return 0
}
func test() int {
	defer deferCall()
	return returnCall()
}
func main() {

	test()
}

输出

returnCall…
deferCall-----

数组
数组定义与遍历
// 注意点1:传参类型必须是:[10]int。
func testArray(test [10]int)  {
	// 此种for循环,出参是 index key。但是若定义了index就必须使用,可通过匿名变量的方式。定义了,但是又没有完全定义。tmd
	for _,value := range test {
		println("value=",value)
	}
	// 这里还是值传递。和java一样。java里数组属于引用类型了。
	// 这行并不会真正生效
	test[7]=10000
}

func main() {
	var ints [10]int

	// 数组定义方式二
	intArr :=[10]int{1111,2222,777}
	//还可以这样定义
	// names :=[]string{"ssss","eeeeeeee"}
	testArray(intArr)
	// 数组遍历方式一
	for i := 0; i < len(ints); i++ {
		println(ints[i])
	}
	// 数组遍历方式二
	for index,value := range ints {
		println("index=",index,",value=",value)
	}
}


切片(动态数组)
func testArray(test []int)  {
	// 引用传递
	for _,value := range test {
		println("value=",value)
	}
	// 修改生效
	test[2]=10000
}

func main() {
	// 动态数组,切片
	intArr :=[]int{1111,2222,777,444,5555,666,777}

	testArray(intArr)
	println("修改后的值=",intArr[2])

}

输出

value= 1111
value= 2222
value= 777
value= 444
value= 5555
value= 666
value= 777
修改后的值= 10000

声明方式
func main() {
	//方式一:声明并初始化
	intArr := []int {1,2,3,56,33}
	fmt.Printf("len=%d,slice=%v\n",len(intArr),intArr)

	// 方式二:注意:此时只是声明并没有分配内存,此时访问,将抛出越界。
	var ints [] int
	// 此时直接访问,ide会高亮,提示。
	//ints[1]=11
	fmt.Printf("len=%d,slice=%v\n\n", len(ints), ints)

	var ageArr [] int
	// 分配空间
	ageArr=make([]int,3)
	ageArr[2]=10
	fmt.Printf("len=%d,slice=%v\n",len(ageArr),ageArr)

	// 第三种方式
	nameArr :=make([]string,3);
	nameArr[0]="dddd"
	fmt.Printf("len=%d,slice=%v\n",len(nameArr),nameArr)
}

切片操作

动态扩容

func main() {

	// 演示动态数组。len和cap的概念。len指的是数组有效数据的长度,cap是给你数组分配了多少位置
	nameArr :=make([]string,3,6);
	nameArr[0]="dddd"
	nameArr[1]="第二"
	// 追加,也就是下标为3的元素。java数组出来就是容量就不会变了。但是go,动态数组,容量会自动扩容。
	nameArr = append(nameArr, "lalaaa")
	fmt.Printf(nameArr[2])

	fmt.Printf("len=%d,cap=%d,slice=%v\n",len(nameArr),cap(nameArr),nameArr)

	for index, va := range nameArr {
		fmt.Printf("index=%d,value=%s\n",index,va)
	}
}

截取

有很多方式进行截取,以及深拷贝

func main() {

	nameArr :=make([]string,4,6);
	nameArr[0]="dddd"
	nameArr[1]="第二"
	nameArr[2]="第3"
	nameArr[3]="第4"

	// 这里slice是个浅拷贝,slice与nameArr 指向一个地方
	//slice := nameArr[:];
	// 同样是浅copy,对slice2修改,影响到nameArr。
	slice2 := nameArr[0:2];
	slice2[0]="修改"
	// 有点像字符串的截取,不同方式
	//slice3 :=nameArr[:4]
	//slice3 :=nameArr[2:]

	// todo 深copy
	deepSlice :=make([]string,len(nameArr),cap(nameArr)*2)
	copy(deepSlice,nameArr)
	fmt.Printf("len=%d,cap=%d,slice=%v\n",len(deepSlice),cap(deepSlice),deepSlice)
	//for i, value := range nameArr {
	//	println("index=",i,",value=",value)
	//}
}
map类型
声明方式
func main() {
	// 方式一:只是声明,并没有初始化
	var hashMap map[int] string
	if hashMap==nil {
		println("没有初始化")
	}
	hashMap =make(map[int]string,3)
	hashMap[1]="java"
	hashMap[2]="c++"

	// 方式二
	hashMap2 :=make(map[string]string,3)
	hashMap2["one"]="java"
	hashMap2["two"]="c"

	// 方式三
	hashMap3 :=map[string]string{
		"1":"java",
		"2":"c",
		"3":"c++",
	}
	fmt.Printf("map=%v\n",hashMap3)



}
基本操作
func printMap(mat map[string]string )  {
	for k,v:= range mat {
		println("key=",k,",value=",v)
	}
}

func main() {
	hashMap:=map[string]string{
		"1":"java",
		"2":"c",
		"3":"c++",
	}
	// 遍历
	printMap(hashMap)
	// 删除
	delete(hashMap,"1")
	// 修改
	hashMap["2"]="java"
	println("----------------")
	printMap(hashMap)

}

struct定义与使用
type Person struct {
	name string
	age int

}

func changeValue(per Person)  {
	per.name="修改值"
}
func pChangeValue(p *Person)  {
	p.name="入参是指针修改值"
}
func main() {
	var person Person
	person.name="szh"
	person.age=111

	fmt.Printf("person=%v\n",person)

	// 修改值(竟然是值传递)
	changeValue(person)
	println("---------修改值后打印-------")
	fmt.Printf("person=%v\n",person)

	// 需要传指针
	pChangeValue(&person);
	println("---------指针修改值后打印-------")
	fmt.Printf("person=%v\n",person)
}

面向对象
封装
// 类名若是大写,表其他模块在导入的时候,可以使用,否则表私有
type Hero struct {
	// 若属性名首字母大写,表public,小写表私有
	Name  string
	Ad    int
	level int
}

func (th *Hero) Show() {
	fmt.Println("name=", th.Name)
	fmt.Println("Ad=", th.Ad)
	fmt.Println("level=", th.level)
}

func (th *Hero) GetName() string  {
	return th.Name
}
func (th *Hero)SetName(newName string)  {
	// th 是调用者该方法的对象的一个副本
	th.Name = newName
}
func main() {
	// 创建对象
	hero  :=Hero{"111",12,1}

	hero.Show()

	hero.SetName("szh")
	hero.Show()
}

继承
type Human struct {
	Name  string
	Sex    int
}

func (th *Human) eat() {
	println("Human eat----")
}
func (th *Human) walk()  {
	println("Human walk----")
}

type SuperMan struct {
	// 表 Super继承 Human
	Human
	level int
}
func (th *SuperMan) eat()  {
	println("SuperMan eat。。。。")
}
func (th *SuperMan)walk() {
	println("SuperMan walk.....")
}

func (th *SuperMan) fly()  {
	println("SuperMan fly.....")
}
func main() {
	human :=Human{"huamn",22}
	human.eat()
	// 创建对象方式
	super :=SuperMan{Human{"lu",1},22}
	super.eat()

	// 第二种创建
	println("---------------")
	var superMan SuperMan;
	superMan.Name="szh"
	superMan.Sex=1
	superMan.level=22
	superMan.eat()
	superMan.fly()
}

多态
// 定义一个接口
// 注意:子类若是没有完全实现接口,则表示,这个子类不是该接口的子类
type AnimalI interface {
	Sleep()
	GetColor() string
	GetType() string
}

// 子类去实现
type Cat struct {
	Color string
}

func (th *Cat) Eat() {
	panic("Cat eat")
}

func (th *Cat) GetColor() string{
	return th.Color
}
func (th *Cat) GetType() string{
	return "cat"
}
func (th *Cat) Sleep()  {
	println("cat is sleep")
}
// 子类去实现
type Dog struct {
	Color string
}

func (th *Dog) GetColor() string{
	return th.Color
}
func (th *Dog) GetType() string{
	return "Dog"
}
func (th *Dog) Sleep()  {
	println("Dog is sleep")
}

func showAnimal(i AnimalI) {
	println(i.GetColor())
	println(i.GetType())
}
func main() {
	//感觉离谱
	var animal AnimalI;
	animal=&Cat{"yellow"}
	animal.GetColor()
	animal.Sleep()

	// 多态演示
	dog :=Dog{"yellow"}
	showAnimal(&dog)
}

万能类型

类似于java的Object,入参可接任意类型

// interface{} 万能类型,类似于Object
func test(arg interface{})  {
	println("test is.....")
	println(arg)

	// 判断入参实际类型
	value,flag:= arg.(string)
	if flag {
		fmt.Println("agr是个string类型")
	}else {
		println("arg不是string,arg=",arg,",value=",value)
	}
}
func main() {
	i :=1
	test(i)
	test(2222)
}

Pair结构

任何变量,都有一个这样的结构,类似于java的头信息

type Reader interface  {
	ReadBook()
}

type Writer interface  {
	WriteBook()
}

type Book struct {

}

func (book *Book)ReadBook()  {
	println("ReadBook-------")
}
func (book *Book)WriteBook()  {
	println("WriteBook-------")
}
func main() {
	// b pair<type:book,value:Book{}地址}
	b :=&Book{}
	b.ReadBook()

	var r Reader
	r=b
	r.ReadBook()

	var w Writer
	w=r.(Writer)
	w.WriteBook()
}

反射
import (
	"fmt"
	"reflect"
)

type User struct {
	Id   int
	Name string
	Age  int
}

// 简单类型
func reflectNum(arg interface{}) {
	fmt.Println("type=", reflect.TypeOf(arg))
	fmt.Println("value=", reflect.ValueOf(arg))

}
func DeFiledAndMethod(input interface{})  {
	// 获取input Type
	inputType :=reflect.TypeOf(input)
	fmt.Println("type=", inputType.Name())
	// 获取input value
	inputValue :=reflect.ValueOf(input)
	fmt.Println("type=", inputValue)

	//得到该类所有属性
	inputType.NumField()

	// 得到该类所有方法。
	//todo 和java类似
	inputType.NumMethod()
}
func main() {
	var num float64 = 1.2
	reflectNum(num)

	println("---------------")
	user := User{1, "sz", 222}

}

获取tag标签
import (
	"reflect"
)

type User struct {
	Id   int    `info:"Id" doc:"主键"`
	Name string `info:"Name" doc:"名称"`
}

func findTag(str interface{}) {
	t := reflect.TypeOf(str).Elem()

	for i := 0; i < t.NumField(); i++ {
		info := t.Field(i).Tag.Get("info")
		doc := t.Field(i).Tag.Get("doc")
		println("info=", info, ",doc=", doc)
	}

}

func main() {
	var use User
	findTag(&use)
}

结构体标签在json中作用
import (
	"encoding/json"
	"fmt"
)

type Movie struct {
	Title  string   `json:"title"`
	Year   int      `json:"Year"`
	Price  int      `json:"price"`
	Actors []string `json:"actors"`
}

func main() {
	movie := Movie{"习题集", 2, 3, []string{"1111", "111"}}
	// 编码的过程,结构体
	jsonStr, err := json.Marshal(movie)
	if err != nil {
		println(err)
		return
	}
	fmt.Printf("jsonStr =%s\n", jsonStr)
	println("jsonStr  --->object")
	myMovie :=Movie{}
	err=json.Unmarshal(jsonStr,&myMovie)
	if err != nil {
		println(err)
		return
	}
	fmt.Printf("jsonStr =%v\n", myMovie)


}

goroutine

匿名方式

import "time"

// 主go,此进程不能退出,若退出则子go也会退出
func main() {
	//定义并调用
	go func() {
		defer println("A defer")
		// 也可以传递参数
		func() {
			defer println("b defer")

			// 退出当前 goroutine
			//runtime.Goexit()

			println("B")
		}()

		println("A")
	}()

	time.Sleep(1 * time.Second)

}

线程通信
无缓冲channel
func main() {
	// 定义一个无缓冲channel
	c :=make(chan int)

	// 子 goroutine
	go func() {
		defer println("子 goroutine end")
		println("子 goroutine  .....")
		// 将666 发送给c
		c <-666
	}()

	// 在主goroutine 中使用num接受,子goroutine的传递的变量
	num := <-c

	println("num = ",num)
	println("main goroutine 结束")

}

无缓冲的channel存在,同步问题。类似,阻塞队列一样。我没有接,你需要等着(阻塞)

有缓存channel
func main() {
	// 定义一个缓冲channel
	c :=make(chan int,3)

	// 子 goroutine
	go func() {
		defer println("子 goroutine end")

		for i := 0; i < 3; i++ {
			c<-i
			println("子 goroutine在运行中,发送元素是:",i,"此时长度len=",len(c))
		}
	}()

	// 主goroutine 休息一会
	time.Sleep(1*time.Second)
	for i := 0; i < 3; i++ {
		// 从channel去元素
		num :=<-c
		println(num)
	}
	
	println("main goroutine 结束")

}

注意:1-channl已经满,再向里面写数据,将会阻塞。2-当channel为空,从里面取数据也会阻塞。

类似于生产者消费者模式

channel关闭特性
func main() {
	c := make(chan int)

	// 子 goroutine
	go func() {
		defer println("子 goroutine end")

		for i := 0; i < 3; i++ {
			c <- i
			println("子 goroutine在运行中,发送元素是:", i, "此时长度len=", len(c))
		}

		// todo 若是使用的是下面的for循环语句,没有关闭的话,将抛出异常
		// close 可以关闭channel
		close(c)
	}()

	// for循环还可这样写
	for {
		// ok为true表channel没有关闭,
		if data, ok := <-c; ok {
			println(data)
		}else{
			break
		}
	}
    
	// todo 也可以这样去写。channel只要不关闭就读取.比上面更加简洁
	for data := range c {
		println(data)
	}

	println("main goroutine 结束")

}

channel与select

若是有同时监视多个channel的需要,可以同时channel与select

func fibonaciii(c, quit chan int) {
	x, y := 1, 1
	for {
		select {
		case c <- x:
			// 若c可写,则case进来
			x, y = y, x+y
		case<-quit:
			println("quit")
			return
		}
	}
}
func main() {
	c:=make(chan int)
	quit :=make(chan int)

	go func() {
		for i := 0; i < 6; i++ {
			println(<-c)
		}
		quit<-0
	}()
	fibonaciii(c,quit)
	println("main goroutine 结束")

}

go modules 模式

一些环境变量的配置

go env -w GO111MODULE=on  // 默认是auto
go env -w GOPROXY=https://goproxy.cn,direct

初始化项目

【TensorFlow项目实战】组织切片配准(切割角度校正) —— (自研)解决了 DeepSlice 配准精度较低的问题 组织切片:即具有一定厚度的组织学(在完整3D脑图像中,具有部分且连续的帧图像),通过逐步切割得到多个切片(如:每隔6um切割一个切片)。但由于切割角度很难与正交轴完全对齐,因此切割过程中往往包含不完美之处。 阅读详情

相关推荐

普冉PY32F003定时器实战:从HSE时钟配置到500ms精准闪烁LED(附完整代码)

本文详细解析了普冉PY32F003单片机定时器的实战应用,从HSE时钟配置到实现500ms精准LED闪烁。通过完整的代码示例和深入的技术分析,帮助开发者掌握定时器参数计算、中断优先级管理及调试技巧,适用于各类嵌入式开发项目。

weixin_30608503的博客 450

【亲测免费】 DeepSlide开源项目安装与使用指南

DeepSlide开源项目安装与使用指南 DeepSlide是一款针对高分辨率全片扫描图像(通常称为显微镜或组织病理学图像)分类的滑动窗口框架,广泛应用于医疗影像分析领域。本指南旨在帮助开发者快速理解项目结构、启动流程以及配置详情,以充分利用此工具。 1. 项目目录结构及介绍 DeepSlide的项目结构精心设计,便于维护与扩展,其大致结构如下: src: 包含核心源代码,是实现滑动窗口分类功能...

gitblog_00097的博客 1185

解锁RK3588视觉潜能:RGA硬件加速库实战指南

本文深入探讨了如何利用RK3588芯片内置的RGA硬件加速库,解决视觉应用中图像预处理的性能瓶颈。通过实战指南,详细介绍了RGA库在YUV转RGB、图像缩放等核心操作上的应用,相比CPU软处理可大幅降低延迟与CPU占用,从而充分释放RK3588的NPU算力,构建高效的AI视觉预处理流水线。

zeta9的博客 669

CortexAST:为AI编码智能体注入语义级代码理解与精准分析能力

在AI辅助编程领域,代码理解是核心挑战。传统基于文本匹配的方法难以把握代码的深层结构和语义关系,导致智能体在重构、导航和影响分析时精度不足。抽象语法树(AST)作为代码的结构化表示,是实现语义级理解的关键技术。通过解析代码生成AST,可以精确识别函数、变量、类等符号及其相互关系,为智能体提供超越文本的“视觉”能力。这种技术能显著提升代码导航的准确性、重构的安全性以及跨文件分析的效率,是构建可靠AI编程工作流的基础。CortexAST项目正是这一理念的工程实践,它作为一个基于Rust的代码智能后端,通过模型上

weixin_42526310的博客 491

PS2硬盘启动终极指南:从FMCB到OPL,告别光驱打造游戏博物馆

在计算机存储与数据读取领域,硬盘启动技术通过将操作系统或应用程序从本地硬盘直接加载,绕过了传统光驱等外部介质,实现了速度与可靠性的双重提升。其核心原理在于利用引导程序接管系统初始化流程,直接访问硬盘上的特定分区与文件镜像。这项技术的价值在于极大提升了数据读取效率、降低了物理介质损耗,并扩展了存储容量与管理的灵活性。在怀旧游戏硬件改造、嵌入式系统定制等场景中,硬盘启动技术被广泛应用,以实现老旧设备的功能焕新与性能优化。本文聚焦于索尼PS2游戏主机的硬盘启动方案,深入探讨了如何利用FMCB(Free MCBoo

weixin_34295316的博客 1777

手把手教你学Simulink--基于火电发电系统的场景实例:燃煤发电机组的锅炉-汽轮机协调控制仿真

本文介绍了使用Simulink构建燃煤发电机组锅炉-汽轮机协调控制系统的仿真方法。系统包含锅炉子系统、汽轮机子系统和协调控制器三大模块,通过传递函数建模和PID控制策略实现协调控制。详细说明了从模型创建、子系统设置到控制器设计的完整流程,包括燃料供给、汽轮机模型和数据处理等关键环节。最后通过性能评估验证系统响应速度、参数稳定性和效率等指标。该仿真方法为火电系统控制策略设计和优化提供了有效工具。

MHD0815的博客 1153

为什么选择LightLLM?全面解析这个轻量级LLM推理框架的核心优势

LightLLM是一个基于Python的LLM(大型语言模型)推理和服务框架,以其轻量级设计、易于扩展和高速性能而著称。对于新手和普通用户来说,选择合适的LLM推理框架可能是一个挑战,而LightLLM凭借其独特的优势,成为众多开发者的理想选择。 ## LightLLM的核心架构解析 LightLLM的架构设计是其高效性能的基础。从整体架构图中可以清晰地看到,它主要由httpserver、Ro

gitblog_00238的博客 490

远程声控系统(MATLAB代码见优快云资源)

远程声控系统技术报告 一、题目要求 实现一个远程声音控制系统。首先采集不同的语音指示信号,进行适当压缩;然后通过噪声信道实现远程传输,远端接收后再通过适当计算识别出是何指示,最后送入一个处于未知状态、但能控/能观的控制系统,完成不同的控制动作。 二、问题分解与解决思路 2.1 系统设计 实验中以汉语数字语音1~9作为指令,数字语音“1”代表一号指令,数字语音“2”代表二号指令,依次类推。发送端发出语音“1”,发送端对应的数字语音文件为“1b.wav”,通过信源编码对语音进行压缩编码,然后进行信道编码并进行基

业精于勤,荒于嬉 5733

Golang学习笔记-GO的各种编译-01

Golang学习笔记-GO的各种编译-01 编译go build 使用go build 在项目目录下执行go build 在其他路径下执行go bulid,需要在后面加上项目的路径(项目路径从GOPATH/src后开始写起,编译之后的可执行文件就保存在当前目录下) go build -o hello,exe 可以指定输出文件的名字 go run 像执行脚本文件一样执行Go代码 go install go install分为两步: 先编译得到一个可执行文件 将可执行文件拷贝到GOPATH/bin 跨平

TKXS 403

道路缺陷检测实战指南:基于YOLOv11的深度学习系统从搭建到落地

道路缺陷检测项目的每一步,都是“理论→实践→反思→优化”的成长循环。当你看到自己开发的系统能精准识别出道路上的每一处裂缝、每一个坑洼时,那种“技术解决真实问题”的成就感,会让你明白深度学习不止是论文里的公式,更是改变行业的工具。如果过程中遇到模型不收敛、界面功能异常等问题,不妨把问题拆解成“数据是否标注准确?”“模型参数是否合理?”“界面逻辑是否有漏洞?”等小问题逐一排查。记住,每解决一个问题,你就离“能独立落地AI项目的工程师”更近一步。

LXY_LOVE36的博客 171

ESP-SPARKBOT AI 智能机器人:v1.2 全流程复刻指南

本文介绍 ESP-SPARKBOT AI 智能机器人 v1.2 版本的全流程复刻,包含 PCB 、3D 打印、固件烧录、常见问题解决、参考资料等

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 9250

Golang学习笔记(上)

func 函数名(形式参数列表)(返回值列表) {函数体。

weixin_57242378的博客 1878

Qt入门教程【环境搭建篇】Qt6+Mingw+QMake+QtCreator

Qt Windows平台安装

小鱼酱的博客 2万+

GoLang 微服务学习笔记

介绍了云原生与微服务的构成,值得一看的教程

Unity、UE5开发 1406

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Golang学习笔记--语言入门【Go-暑假学习笔记】

来实现枚举,下面是一个简单的例子。

weixin_51621120的博客 1246

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

go在方法中修改结构体的值_Golang的学习笔记(11)--Go结构体

Golang的学习笔记(11)--Go结构体目录Go结构体Go的结构体是一种复合类型,它由一系列属性(字段)组成,每个属性(字段)都有自己的类型和值。结构体的字段可以是任何类型,甚至是结构体本身、函数、接口等在Go中没有类的概念,因此结构体经常被用来替代面向对象中的类的操作Go结构体的定义结构体的定义格式如下:type structName struct {field1 type1field2 t...

weixin_39581995的博客 2718

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

GoLang学习笔记

GoLang学习笔记

kodmoqn的博客 89

【Golang笔记04】Go语言中文件操作的学习笔记

Golang笔记04:文件操作学习笔记;一、文件操作,Go语言中,文件操作的标准类库有很多,例如:os、io等包都可以用于操作文件。1.1、打开文件,Go语言中,可以使用os包中提供的Open()函数来打开文件,另外,还可以使用OpenFile()函数来打开文件。1.1.1、Open()函数,Open(name string)函数:打开指定文件,返回值一个File文件指针,以及err错误。

✅ Java 开发工程师 989

Golang学习笔记_26——通道

虽然协程可以并发执行,但有时候我们需要在协程之间传递数据或进行同步。在Go中,这是通过通道(Channel)来实现的。在Go中,协程是通过go关键字来创建的。当你使用go关键字调用一个函数时,该函数会在一个新的协程中执行。通道的类型由通道中传递的元素类型决定。例如,chan int是一个可以传递int类型数据的通道。协程的调度由Go运行时(runtime)管理,开发者不需要关心具体的调度细节。通道是一种类型安全的、多路复用的、在协程之间传递通信的管道。)向通道发送或接收数据。

LuckyLay的博客 867

Golang学习笔记_17——方法

在Go语言中,方法(Method)是一种带有接收者(Receiver)的函数。接收者可以是值接收者(Value Receiver)或指针接收者(Pointer Receiver),并且它允许我们为特定类型定义附加的行为。方法使得我们可以像面向对象编程一样为结构体(Struct)或其他类型定义方法,但Go本身并不是纯面向对象的语言。记住:方法只是个带接收者参数的函数。// 方法体recv:接收者变量名,它是方法作用的对象实例。:接收者的类型,可以是值类型或指针类型。MethodName。

LuckyLay的博客 1198

Golang学习笔记//序

偶然了解到了Golang,一直被C++、JAVA、Python在不同的方面折磨,现在我爱上了Golang------不评判语言孰胜孰劣,仅仅是我个人爱上了Golang。 资料实在是太少了,处于无奈只能让连勉强CET4过的我去啃《The Way to Go》。我想,自己受过的苦,后面的人可以少受一些------至少baidu能搜出一些资料,哪怕很浅显。 这一系列的学习笔记,会

三门一灯 683

Golang学习笔记_16——Map

在Go语言中,map是一种内置的数据结构,用于存储键值对(key-value pairs)。map提供了快速的查找、插入和删除操作,使得它在处理需要快速访问的数据时非常高效。

LuckyLay的博客 976

golang学习笔记第四节

本文介绍了Go语言中的并发编程基础,重点讲解了Goroutine和Channel的使用。Goroutine是Go语言中并发执行的最小单位,通过go关键字可以轻松创建。文章详细展示了如何创建和退出Goroutine,并通过代码示例说明了Goroutine的执行流程。此外,文章还介绍了Channel的概念,包括无缓冲Channel和有缓冲Channel的区别,以及如何通过Channel在多个Goroutine之间进行通信。最后,文章介绍了select语句的使用,它可以监听多个Channel,并根据就绪的Chan

m0_52952084的博客 1320

Golang学习笔记项目教程

本项目`golang-notes`旨在帮助理解Golang语言中的特定概念,特别是对于那些具有面向对象编程(OOP)背景的开发者。以下是项目的目录结构及其说明: - `COPYING.md`:包含项目的许可证信息。 - `README.md`:项目的主页,介绍了项目的目的和主要内容。 - `OOP.md`:介绍了Golang中的结构体(struct)和接口(interface)如何与OOP概念相...

gitblog_01167的博客 287

Golang学习笔记_13——数组

/ 数组可以通过显式地指定长度和元素类型来定义// 定义时直接初始化数组的元素// 省略数组的长度,编译器会根据提供的初始化值的数量自动推断。

LuckyLay的博客 916

Golang学习笔记_47——访问者模式

访问者模式是一种行为型设计模式,允许在不修改已有对象结构的前提下定义新的操作。其核心特点包括:•操作解耦:将数据操作与数据结构分离•双重分发:通过两次方法调用实现动态绑定•扩展开放:新增操作无需修改现有类。

LuckyLay的博客 1521
上一篇: base64 转 MultipartFile
下一篇: 关于前后端时间(LocalDateTime)对接问题
一个大泥球
博客等级 码龄9年 41粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值