Golang语法特性总结
1.认识Golang代码特性
package main //1.包含main函数的文件就是一个main包--当前程序的包名// import "fmt"
// import "time"
import("fmt""time"
)//3.同时包含多个包 4.强制代码风格:函数的 { 一定和函数名在同一行,否则会出现语法错误//main函数
func main() {fmt.Println("hello Go!")// fmt.Println("hello Go!"); 2.加不加分号都可以,建议不加分号time.Sleep(1 * time.Second)
}
2.Golang变量声明的四种方式
package mainimport ("fmt"
)func main() {//方法一:声明一个变量,不初始化默认是0var a intfmt.Println("a =",a)fmt.Printf("type of a = %T\n",a)//方法二:声明一个变量,初始化var b int = 100fmt.Println("b =",b)fmt.Printf("type of b = %T\n",b)var bb string = "abcd"fmt.Printf("bb = %s,type of bb = %T\n",bb,bb)//方法三:在初始化时可以省去数据类型,通过值自动匹配当前的变量的数据类型var c = 100fmt.Println("c =",c)fmt.Printf("type of c = %T\n",c)var cc = "abcd"fmt.Printf("cc = %s,type of cc = %T\n",cc,cc)//方法四:(常用的方法)省去var的关键字,直接:=自动匹配;在声明的变量是全局变量时,方法四是不可用的会报错e := 100fmt.Println("e =",e)fmt.Printf("type of e = %T\n",e)ee := "abcd"fmt.Printf("ee = %s,type of ee = %T\n",ee,ee)eee := 3.14fmt.Printf("eee = %s,type of eee = %T\n",eee,eee)//声明多个变量var xx,yy int = 100,200 //相同数据类型fmt.Println("xx =",xx," yy =",yy)var mm,nn = 100,"abcd" //不同数据类型fmt.Println("mm =",mm," nn =",nn)//多行的多变量声明var (vv int = 100jj bool = true)fmt.Println("vv =",vv," jj =",jj)
}
3.常量与iota
package main//const 来定义枚举类型
const (//可以在const()添加一个关键字 iota,每行的iota都会累加1,第一行的iota的默认值是0BEIJING = iota //iota = 0SHANGHAI //iota = 1SHENZHEN //iota = 2
)
//iota只能出现在const的括号中
const (a,b = iota+1,iota+2// 0+1,0+2c,d // 1+1,1+2e,f // 2+1,2+2g,h = iota*2,iota*3// 3*2,3*3i,k // 4*2,4*3
)
func main()
{//常量-具有只读属性const length int = 10fmt.Println("length = ",length)length = 100 //报错-常量不可更改
}
4.Golang多返回值的三种写法
package main
import "fmt"func fool(a string,b int) int {fmt.Println("a = ",a)fmt.Println("b = ",b)c := 100return c
}//1.返回多个返回值-匿名
func foo2(a string,b int) (int,int) {fmt.Println("a = ",a)fmt.Println("b = ",b)return 666,777
}//2.返回多个返回值-有形参名称
func foo3(a string,b int) (r1 int,r2 int) {fmt.Println("------------foo3-----------")fmt.Println("a = ",a)fmt.Println("b = ",b)r1 = 1000r2 = 2000return r1,r2//return; 方法3--也可以返回r1,r2
}func main() {c := fool("abc",555)fmt.Println("c = ",c)ret1,ret2 := foo2("bfr",666)fmt.Println("ret1 = ",ret1,"ret2 = ",ret2)ret3,ret4 := foo3("grx",777)fmt.Println("ret3 = ",ret3,"ret4 = ",ret4)
}
5.init函数与import导包
递归式导包直到最后一个包没有依赖包->加载该包全局的常量变量->执行init函数
"主程序开始之前,加载一些配置文件、加载一些数据库的内容、基本环境变量的初始化"
package mainimport("GolangStudy/Golang_5/lib1""GolangStudy/Golang_5/lib2"
)func main(){lib1.LibTest()lib2.LibTest()
}
package lib1import "fmt"//API接口
func LibTest() {fmt.Println("Lib1Test.....")
}
//init初始化函数
func init() {fmt.Println("Lib1init.....")
}
package lib2import "fmt"//API接口--大写首字母表示对外开放该接口
func LibTest() {fmt.Println("Lib2Test.....")
}
//init初始化函数
func init() {fmt.Println("Lib2init.....")
}
运行结果:
三种导包的方式:
//三种导包的方式
import(_ "GolangStudy/Golang_5/lib1" //_表示匿名,可以在不使用该包但是可以调用它的init函数-无法使用当钱包的方法//mylib "GolangStudy/Golang_5/lib2" //给包起别名mylib. "GolangStudy/Golang_5/lib2" // . 表示将该包直接导入main包直接使用
)func main(){//lib1.LibTest()//lib2.LibTest()//mylib.LibTest()LibTest()//同名方法容易导致歧义
}
6.Golang中指针的使用
package main
import "fmt"func swap(pa *int, pb *int) {var tem int;tem = *pa *pa = *pb*pb = tem
}func main() {var a int = 10var b int = 20swap(&a,&b)fmt.Println("a = ",a,"b = ",b)var p *intp = &afmt.Println("p = ",p)var pp **int = &pfmt.Println("pp = ",pp)
}
7.Golang中的defer语句
package main
import "fmt"func main(){//写入defer关键字--类似C++中的析构函数--出它作用域时会调用defer fmt.Println("main end1")//先入栈defer fmt.Println("main end2")//再入栈fmt.Println("main run1")fmt.Println("main run2")
}
输出结果:
defer和return的执行顺序
func deferFunc() int{fmt.Println("defer func called...")return 0
}
func returnFunc() int{fmt.Println("return func called...")return 0
}
func rad() int {defer deferFunc()return returnFunc()
}
func main() {rad()
}
输出结果: return比defer先执行
8.Golang中的数组
—静态数组
静态数组传参是值拷贝传参,并且只能接收特定格式的数组确定元素类型与元素个数
package main
import "fmt"//值拷贝传参,将实参数组拷贝给形参
func printArray(myArray [10]int) { //只能接收1、2即int[10]数据类型for index,value:=range myArray {fmt.println(index," ",value)}
}
func printArray(myArray [4]int) { 只能接收3即int[4]数据类型for index,value:=range myArray {fmt.println(index," ",value)}
}func main(){//固定长度的数组var myArray1 [10]intmyArray2 := [10]int{1,2,3,4}myArray3 := [4]int{1,2,3,4}//for i:= 0; i<10; i++for i:=0; i<len(myArray1); i++{fmt.println(myArray1[i])}for index,value:=range myArray1 {fmt.println(index," ",value)}//查看数组的数据类型fmt.printf("myArray1 types = %T\n",myArray1)fmt.printf("myArray2 types = %T\n",myArray2)fmt.printf("myArray3 types = %T\n",myArray3)
}
—动态数组(slice切片)
package main
import "fmt"//动态数组具有传参上的优势
//传递的是当前数组的指针首地址,引用传递
func printArray(myArray []int) {// _ 表示匿名的变量for _, value := range myArray {//不关心下标,但必须用两个接收fmt.Println("value = ",value)}myArray[0] = 100
}func main() {myArray := []int{1,2,3,4} //动态数组,切片 slicefmt.Printf("myArray type is %T\n",myArray)//输出:myArray type is []intprintArray(myArray)for _, value := range myArray {fmt.Println("value = ",value)}
}
—四种声明一个切片的方式
func main () {//声明slice是一个切片,并且初始化,默认值是1,2,3;长度len是3slice := []int{1,2,3}//声明slice1是一个切片,但没有给它分配空间var slice1 []int //此时长度就是0slice1 = make([]int,3)//通过make给slice1分配空间,默认值是0//声明slice2是一个切片,同时通过make给slice2分配空间,默认值是0var slice2 []int = make([]int,3)//声明slice3是一个切片,同时分配空间,通过:=推导出slice是一个切片slice := make([]int,3)fmt.Printf("len = %d,slice = %v\n",len(slice1),slice1)//判断一个slice是否为0if slice == nil {fmt.printf("slice是一个空切片")}else{fmt.printf("slice不是一个空切片")}
}
—切片容量的追加
func main () {var numbers = make([]int,3,5)//开辟五个空间只初始化3个为0fmt.Printf("len = %d,cap = %d,numbers = %v\n",len(numbers),cap(numbers),numbers)//向numbers切片追加一个1numbers = append(numbers,1)fmt.Printf("len = %d,cap = %d,numbers = %v\n",len(numbers),cap(numbers),numbers)numbers = append(numbers,2)fmt.Printf("len = %d,cap = %d,numbers = %v\n",len(numbers),cap(numbers),numbers)numbers = append(numbers,3)//会进行2倍扩容fmt.Printf("len = %d,cap = %d,numbers = %v\n",len(numbers),cap(numbers),numbers)var numbers2 = make([]int,3)//开辟三个空间并全部初始化为0fmt.Printf("len = %d,cap = %d,numbers2 = %v\n",len(numbers2),cap(numbers2),numbers2)numbers2 = append(numbers2,1)//会进行2倍扩容fmt.Printf("len = %d,cap = %d,numbers2 = %v\n",len(numbers2),cap(numbers2),numbers2)
}
输出结果:
—切片的截取
func main () {s := []int{1,2,3} //len=3,cap=3//[0,2)s1 := s[0:2] //取1和2,前面省略表示从第0个开始取,后面省略表示取到最后一个fmt.Println(s1)s1[0] = 100fmt.Println(s1) //s1此时也指向s的第一个,相当于浅拷贝fmt.Println(s)//copy深拷贝,将底层数组的slice一起进行拷贝s2 := make([]int,2) //s2 = [0,0,0]copy(s2,s1)fmt.Println(s2) //可以先将s切片成s1,再进行深拷贝给s2,就可以分离
}
9.Golang中基于哈希的Map
—Map的三种声明定义方式
func main() {//第一种声明方式var myMap1 map[string]string //仅仅是声明,没有实际的空间,并不能被使用if myMap1 == nil {fmt.Println("myMap1是一个空map")}myMap1 = make(map[string]string,10) //用make给Map开辟十个键值对的空间myMap1["one"] = "java"myMap1["two"] = "C++"myMap1["three"] = "python"//...当插入十个之后也会二倍扩容fmt.Println(myMap1)//打印出来是无序的//第二种声明方式myMap2 := make(map[int]string)myMap2[1] = "java"myMap2[2] = "C++"myMap2[3] = "python"fmt.Println(myMap2)//第三种声明方式myMap3 := map[int]string {4 : "java",5 : "C++",6 : "python",}fmt.Println(myMap3)
}
—Map的基本使用
func printMap(cityMap map[string]string) {for key,value := range cityMap {fmt.Printf("key = %s ",key)fmt.Printf("value = %s\n",value)}cityMap["one"] = "golang"
}//指向当前map内存结构体地址的指针cityMapfunc main() {cityMap := make(map[string]string,3)//添加cityMap["one"] = "java"cityMap["two"] = "C++"cityMap["three"] = "python"//删除delete(cityMap,"three")//修改cityMap["two"] = "php"//传参printMap(cityMap)//遍历for key,value := range cityMap {fmt.Printf("key = %s ",key)fmt.Printf("value = %s\n",value)}
}
//将一个map赋值给另一个时只能完成指针之间的浅拷贝,只能通过make开辟一个Map进行遍历赋值
10.struct(类)的定义和使用
—struct类的定义
//声明一种行的数据类型,是Int的一个别名
type myint int
type Book struct {title stringauth string
}func changeBook(book Book) {//传递book的一个副本book.auth = "666"
}
func changeBook2(book *Book) {//传递指向Book结构体的指针book.auth = "777"
}func main() {// var a myint = 10// fmt.Printf("type = %T",a)var book1 Bookbook1.title = "Golang"book1.auth = "zhang3"fmt.Printf("book1 = %v",book1)
}
—类的封装和方法的调用
//go语言中的类实际上是通过结构体来绑定方法
package main//方法名、类名如果首字母大写,其它包也可以访问
type Hero struct {Name stringAd intLevel int
}//当前括号表示该方法绑定到了Hero结构体,this表示调用对象,谁调用该方法this就指哪个对象
func (this Hero) GetName() string{return this.Name
}//this是当前调用对象的一个副本
func (this Hero) SetName(newName string) {this.Name = newName
}
//此时this就是指向当前对象的指针,就可以修改了
func (this *Hero) SetName(newName string) {this.Name = newName
}func main() {//创建一个对象hero := Hero{Name: "zhang3",Ad: 100,Level: 1}
}
—继承的基本语法
type Human struct {name stringsex string
}func (this *Human) Eat() {fmt.Println("human Eat().....")
}
func (this *Human) Walk() {fmt.Println("human Walk().....")
}type SuperMan struct {//Go中实际是以组合的形式实现继承Human //Superman继承了Human类的所有方法level int
}//重写(覆盖)父类方法
func (this *SuperMan) Eat() {fmt.Println("SuperMan Eat().....")
}//子类的新方法
func (this *SuperMan) Fly() {fmt.Println("SuperMan Fly().....")
}func main() {h := Human{"zhang3","female"}h.Eat()h.Walks := SuperMan{Human{"li4","female"},88}// var s SuperMan// s.name = "li4"//...s.Walk() //子类调用父类的方法s.Eat() //子类调用子类重写的方法s.Fly() //子类调用子类的新方法
}
—interface实现多态
package main
//面向对象的多态:定义一个接口完成多态的现象;接口定义抽象方法,子类去继承实现重写这个方法//interface本质上是一个指针,指向当前类型包含的函数列表
type AnimalIF interface {Sleep()GetColor() string //获取动物的颜色GetType() string //获取动物的类型
}//具体的值--要继承AnimalIF interface只需要将他的三个方法实现,不需要显式继承
type Cat struct {color string //猫的颜色
}func (this *Cat) Sleep() {fmt.Println("cat is sleep")
}func (this *Cat) GetColor() string {return this.color
}func (this *Cat) GetType() string {return "cat"
}//具体的值--狗
type Dog struct {color string
}func (this *Dog) Sleep() {fmt.Println("Dog is sleep")
}func (this *Dog) GetColor() string {return this.color
}func (this *Dog) GetType() string {return "Dog"
}func showAnimal(animal AnimalIF)//调用该函数,形参为父类指针,实参为子类对象实现多态
{animal.Sleep()
}func main() {// var animal AnimalIF //接口的数据类型,相当于定义了一个父类指针// animal = &Cat("green") //让父类的指针指向一个子类对象// animal.Sleep() //指向子类对象的父类指针调用子类方法实现多态cat := Cat("green")dog := Dog("yellow")showAnimal()
}
—interface{}空接口万能类型
//interface{} 空接口,万能类型-》可以引用任意数据类型
package mainimport "fmt"func myFunc(arg interface{}) { //可以传任意类型的实参fmt.Println("myFunc is called..")fmt.Println(arg)//类型断言value,ok := arg.(string) //value是数据值,ok是errorif !ok {fmt.Println("arg is not a string")}else{fmt.Println("arg is a string")}fmt.Println(value)
}type Book struct {auth string
}func main() {book := Book{"Golang"}myFunc(book)myFunc("abcd")myFunc(888)myFunc(23.45)
}
11.Golang中反射的概念
—接口type interface { }的类型
Golang中一个变量包含一个pair即type和value对。
type分为static type(在编译时就确定并且不会改变)和concrete type(在运行时确定并且会改变)。
var i int // static type 为 int;
var i interface{} // pair()
i = 18 // concrete type 为 int
i = "Go编程时光" // concrete type 变为 string
type Reader interface {ReadBook()
}type Writer interface {WriteBook()
}//具体类型
type Book struct {
}func (this *Book) ReadBook() {fmt.Println("Read a book.")
}func (this *Book) WriteBook() {fmt.Println("Write a book.")
}func main() {b := &Book{} //type:*Book value:0xc000012028var r Reader //concrete type:nil,static type:Reader value:nilr = b //concrete type:Book*,static type Reader value:0xc000012028r.ReadBook() //Reader - Book* 多态var w Writer //concrete type:nil,static type:Writer value:nilw = r.(Writer)//类型断言,检查r是否实现了Writer,并将Book*给ww.WriteBook()
}
—reflect.ValueOf 和 reflect.TypeOf
package mainimport "fmt"
import "reflect"type User struct {Id int//一个filedName string//第二个filedAge int //第三个filed
}func (this *User) Call() {fmt.Println("User is called ...")fmt.Println("%v\n",this)
}func main() {user := User{1,"bfr",18}DoF(user)
}func DoF(input interface{}) {//获取input的typeinputType := reflect.TypeOf(input)fmt.Println("inputType :",inputType.Name())//?直接打印出当前类型的名称?//获取input的valueinputValue := reflect.ValueOf(input)fmt.Println("inputValue :",inputValue)//通过type获取里面重要字段//通过inputType可以获取NumFiled,进行遍历,就能得到每个filedfor i := 0;i < inputType.NumField(); i++ {field := inputType.Field(i)value := inputValue.Field(i).Interface()//?获取字段的值fmt.Printf("%s: %v = %v\n",field.Name,field.Type,value)//ID,int,1}//通过Type获取里面的方法,调用for i:=0; i<inputType.NumMethod(); i++ { //遍历User有多少个方法m := inputType.Method(i)fmt.Printf("%s: %v\n",m.Name,m.Type)}
}
12.结构体标签
package main
import "fmt"
import "reflect"//在不同包中有不同的解释说明
type resume struct {Name string `info:"name" doc:"我的名字"`Sex string `info:"sex"`
}func findTag(str interface{}) {t := reflect.TypeOf(str).Elem()//Elem当前结构体的全部元素for i := 0; i < t.NumField(); i++ {taginfo := t.Field(i).Tag.Get("info")tagdoc := t.Field(i).Tag.Get("doc")fmt.Println("info: ",taginfo," dac:",tagdoc)}
}func main() {var res resumefindTag(&res)
}
//结构体标签-key已知,value未知
type Movie struct {Title string `json:"title"` //在json中显示的字段Year int `json:"year"`Price int `json:"price"`Actors []string `json:"actors"`
}func main() {movie := Movie{"喜剧之王",2000,10,[]string{"xingye","zbz"}}//编码的过程 将结构体->jsonjsonStr,err := json.Marshal(movie)//Marshal可以将结构体转化为json格式if err != nil {fmt.Println("json marshal error",err)}else{fmt.Printf("josnStr = %s\n",jsonStr)}//解码的过程 json->结构体myMovie := Movie{}err = json.Unmarshal(jsonStr,&myMovie)//将json字符串解析给myMovie结构体if err != nil {fmt.Println("json unmarshal error",err)return}
}
13.Golang中的协程:goroutine
—协程的演变发展
—单进程的操作系统只能顺序执行任务,一旦某个任务阻塞,其它任务都不能处理。
—多进程/多线程解决了,CPU调度器进行轮询调度切换进程/线程 ,当某个时间片到了就会切换。但是进程/线程间切换具有成本,一旦数量过大,CPU的使用效率就会大大降低。进程占4GB左右,线程占用4MB左右,也有高内存占用的弊端。
—将一个线程拆分,一半在用户层面供用户调用(协程:co-routine),一半在内核层供CPU调度。
—N : 1,如果有一个协程阻塞,那它的下一个协程就会受到影响。操作系统感知不到用户级协程的存在,无法将阻塞的协程与线程分离,线程资源被完全占用
—M : N,利用多核,一个CPU绑定多个线程;解决了某个协程阻塞影响其它协程的问题;通过优化写成调度器优化效率,CPU不做调度。
—Golang对协程的处理
co-routine -> goroutine;将占用内存优化到KB单位(可以大量生产),(可以灵活调度)。
—通过优化调度器实现灵活调度
package mainimport "fmt"
import "time"func newTask() {i:=0for { i++fmt.Printf("new Goroutine : i = %d\n",i) time.Sleep(1 * time.Second)}
}func main() {//创建一个go程 去执行newTask()流程go newTask()time.Sleep(10*time.Second)fmt.Println("main goroutine exit")// i:=0// for { //死循环main// i++// fmt.Printf("main goruntine: i = %d\n",i)// time.Sleep(1*time.Second)// }
}
package mainimport "fmt"
import "time"
import "runtime"func main() {//调匿名无参goroutinego func() {//匿名方法,直接用Go承载一个形参为空返回值为空的一个函数defer fmt.Println("A.defer")func() {//仅仅是函数定义defer fmt.Println("B.defer")//return runtime.Goexit()fmt.Println("B")}()fmt.Println("A")}()//调用//调匿名有参goroutinego func(a int,b int) bool { //并不是阻塞操作,是一个异步操作,不能拿到返回值fmt.Println("a = ",a," b = ",b)return true}(10,20)time.Sleep(1*time.Second)
}
14.channel-go语言中协程间通信的机制
—构成死锁:
1.无缓存channel、只写不读或只读不写、导致主线程阻塞。
2.有缓存channel、已满只写不读或为空只读不写、导致主线程阻塞。
package main
import "fmt"
//import "time"func main() {c := make(chan int,3)//带有缓冲的channelfmt.Println("len(c) = ",len(c)," cap(c) = ",cap(c))go func() {defer fmt.Println("子go程结束")for i:=0;i<6;i++{c <- ifmt.Println("running...:","i = ",i," len(c) = ",len(c)," cap(c) = ",cap(c))}}()//time.Sleep(2 * time.Second)// for i:=0;i<2;i++ {// num := <-c //从c中接收数据,并赋值给num// fmt.Println("num =",num)// }fmt.Println("main 结束")
}
—close关闭channel
关闭channel后,无法向channel再发送数据(再发会引发 panic 错误后导致接收立即返回零值)
关闭channel后,仍旧具有缓存,等读端读完了才会返回。
简单var声明一个channel数据类型,没有进行make,称为nil channel。无论收发都会阻塞。
package main
import "fmt"
func main() {c := make(chan int)go func() {for i:=0;i<5;i++ {c <- i}//close可以关闭一个channelclose(c)}()for {//ok=true表示channel没有关闭if data,ok := <-c; ok { //原子性操作:确保通道接收与状态检查在同一个代码块中完成fmt.Println(data)}else{break}}fmt.Println("Main Finished..")
}
—channel 和 range
尝试从c中读数据,range会阻塞等待这个结果;c中有数据range就会返回并进入本轮for循环,没有数据就会阻塞
//可以使用range来迭代不断操作channel
for data := range c { fmt.Println(data)}
—channel 和 select
单流体下的一个go只能监视一个channel状态,阻塞监听,select可以解决一个go监听多个channel状态,如果某个channel可读或可写它就会立刻返回。一般会循环进行select监控多个channel。
package mainimport "fmt"func fibo(c,quit chan int){x,y := 1,1 //1,1->1; 1,2->1; for{select{case c <- x: //只要func可读这边就可写//如果c可写,则该case就会进来t := xx = yy = t+ycase <-quit: //只要quit被写入这边就可读就退出fmt.Println("quit")return}}
}func main() {c := make(chan int)quit := make(chan int)go func() {for i := 0; i < 6; i++{fmt.Println(<-c)//读c}quit <- 0 //循环结束退出}()//main gofibo(c,quit)
}
相关文章:
Golang语法特性总结
1.认识Golang代码特性 package main //1.包含main函数的文件就是一个main包--当前程序的包名// import "fmt" // import "time" import("fmt""time" )//3.同时包含多个包 4.强制代码风格:函数的 { 一定和函数名在同一行,否…...
AI绘画软件Stable Diffusion详解教程(6):文生图、提示词细说与绘图案例
文生图即以文字描述来生成图像,这是目前所有AI绘画软件的基本功能之一。要想画一副好的图片,除了选择好的模型,在文生图中,提示词特别关键。 一、什么是提示词(Prompt) 提示词又称创意、关键词、咒语、ca…...
getline的使用(L1-059敲笨钟)
在 C 中,getline 函数主要有两种常用的形式,分别是 <iostream> 头文件中的 std::getline 用于从输入流读取一行字符串,以及 <cstdio> 头文件中的 std::getline(C11 引入)用于从文件流读取一行。下面分别介…...
Python数据可视化
1.Python 数据可视化全指南 🚀 数据可视化是数据分析和机器学习的关键环节,Python 提供了丰富的可视化库,如 Matplotlib、Seaborn、Plotly、Pandas 内置可视化等。以下是 Python 可视化的核心内容及最佳实践。 2. 基础可视化库 2.1 Matplot…...
探秘基带算法:从原理到5G时代的通信变革【五】CORDIC算法
文章目录 2.4 CORDIC算法2.4.1 CORDIC算法的基本原理2.4.2 方法论与分类体系旋转模式矢量模式线性模式 2.4.3 **CORDIC 算法中的误差来源****角度逼近误差的分析****缩放效应误差的分析****精度需求与迭代次数的关系****常见应用场景下的迭代次数建议****总结** 2.4.4优缺点分析…...
golang介绍,特点,项目结构,基本变量类型与声明介绍(数组,切片,映射),控制流语句介绍(条件,循环,switch case)
目录 golang 介绍 面向并发 面向组合 特点 项目结构 图示 入口文件 main.go 基本变量类型与声明 介绍 声明变量 常量 字符串(string) 字符串格式化 空接口类型 数组 切片 创建对象 追加元素 复制切片 map(映射) 创建对象 使用 多重赋值 控制流语句…...
大语言模型学习--本地部署DeepSeek
本地部署一个DeepSeek大语言模型 研究学习一下。 本地快速部署大模型的一个工具 先根据操作系统版本下载Ollama客户端 1.Ollama安装 ollama是一个开源的大型语言模型(LLM)本地化部署与管理工具,旨在简化在本地计算机上运行和管理大语言模型…...
力扣-动态规划-53 最大子数组和
思路 dp数组定义:以i为结尾的字符串的最大子数组和为dp[i]递推公式: dp[i] max(nums[i], dp[i-1] nums[i]);dp数组初始化:dp[0] nums[0];遍历顺序:顺序时间复杂度: 代码 class Solution { public:int maxS…...
论文阅读和代码实现EfficientDet(BiFPN)
BiFPN 采用双向特征融合,让 P3 和 P4 不仅能获取来自 Backbone 的信息,还可以有效吸收 P5 的高级语义特征,增强小目标的判别能力 通过 加权特征融合(Weighted Feature Fusion),BiFPN 让 P3 层能够 自动调整…...
[杂学笔记] 封装、继承、多态,堆和栈的区别,堆和栈的区别 ,托管与非托管 ,c++的垃圾回收机制 , 实现一个单例模式 注意事项
文章目录 1.封装、继承、多态2. 堆和栈的区别3.指针和引用的区别4. 托管与非托管5. c的垃圾回收机制6. 实现一个单例模式 注意事项 1.封装、继承、多态 封装就是将数据和内部的方法封装到一个类中,对外隐藏内部实现细节,但是留下了公共接口提供给外部使…...
c++ std::bind、std::bind_front使用笔记
c std::bind、std::bind_front使用笔记 std::bind 和 std::bind_front 的使用说明std::bind (C11 引入)std::bind_front (C20 引入) 应用场景应用注意事项应用注意事项的例子 std::bind 和 std::bind_front 的使用说明 std::bind (C11 引入) std::bind 用于创建一个新的可调用…...
神策数据严正声明
近日,我们发现有不法分子冒充神策网络科技(北京)有限公司(以下简称”神策数据”)的名义,发布虚假的招聘广告、面试邀请,企图误导求职者并进行不法行为。对此,我司发布严正声明&#…...
vue+elementui 实现上传文件/导入文件的功能
vueelementui 实现上传文件/导入文件的功能 1. 上传组件 <el-form-item label"上传文件:"><el-uploadaction"":file-list"fileList":show-file-list"false":http-request"handUpLoad"drag:limit"…...
FastGPT 引申:知识库辅助开发(代码符号自动提取与文件匹配工具详解)
文章目录 FastGPT 引申:知识库辅助开发(代码符号自动提取与文件匹配工具详解)1. 符号提取 prompt2. 文件查询 prompt3. 总结 FastGPT 引申:知识库辅助开发(代码符号自动提取与文件匹配工具详解) 在开发过程…...
李国杰院士 “七问” DeepSeek:深度剖析 AI 发展新态势
李国杰院士 “七问” DeepSeek:深度剖析 AI 发展新态势 在人工智能领域的探索之路上,李国杰院士凭借深厚的学术造诣和前瞻性的眼光,成为指引方向的重要灯塔。 李国杰院士任职于中国科学院计算技术研究所,担任研究员一职。他不仅是…...
C#中泛型的协变和逆变
协变: 在泛型接口中,使用out关键字可以声明协变。这意味着接口的泛型参数只能作为返回类型出现,而不能作为方法的参数类型。 示例:泛型接口中的协变 假设我们有一个基类Animal和一个派生类Dog: csharp复制 public…...
transformer架构解析{掩码,(自)注意力机制,多头(自)注意力机制}(含代码)-3
目录 前言 掩码张量 什么是掩码张量 掩码张量的作用 生成掩码张量实现 注意力机制 学习目标 注意力计算规则 注意力和自注意力 注意力机制 注意力机制计算规则的代码实现 多头注意力机制 学习目标 什么是多头注意力机制 多头注意力计算机制的作用 多头注意力机…...
SpringBoot生成唯一ID的方式
1.为什么要生成唯一ID? 数据唯一性:每个记录都需要有一个独一无二的标识符来确保数据的唯一性。这可以避免重复的数据行,并有助于准确地查询、更新或删除特定的记录。 数据完整性:通过使用唯一ID,可以保证数据库中的数…...
认识时钟树
时钟源 高速外部震荡器HSE 低速外部震荡器LSE 高速内部震荡器HSI 低速内部震荡器LSI 易混淆点: RC(Resistor-Capacitor,电阻-电容振荡器)一般是内部时钟源 RTC(Real-Time Clock,实时时钟)…...
NLP如何训练AI模型以理解知识
一、自然语言处理(NLP)的定义与核心目标 1. 什么是自然语言处理? NLP是计算机科学与人工智能的交叉领域,旨在让机器具备以下能力: • 理解:解析人类语言(文本或语音)的语法、语义和…...
linux如何在某个文件夹下查看所有文件(层级只到当前文件夹的两层)并找到‘XXXX’ 这个单词
问了AI写的不错,记录一下,排查一些报错的时候比较好用 在 Linux 中,您可以通过命令行工具查看某个文件夹下的所有文件(限制到当前文件夹及其子文件夹两层深度),并搜索包含特定单词(如 XXXXX&am…...
Android 常见View的防抖
在开发Android应用时,我们经常会遇到用户快速点击按钮或者频繁触发某个事件的情况。这种行为可能会导致不必要的重复操作,例如多次提交表单、重复加载数据等。为了避免这些问题,我们需要对这些事件进行防抖处理。本文将详细介绍如何在Kotlin中…...
Unity打包到webgl鼠标图标大小不正确
我使用了自定义鼠标纹理,打包出来发现鼠标特别的大,位置也不对劲 研究了一下,不考虑浏览器界面缩放的话,可以直接改import settings的最大尺寸,改成合适的尺寸。 暂时先这样解决吧 最后贴一个设置鼠标图标的代码 pub…...
CentOS 7中安装Dify
Dify 是一个开源的 LLM 应用开发平台。其直观的界面结合了 AI 工作流、RAG 管道、Agent、模型管理、可观测性功能等,让您可以快速从原型到生产。尤其是我们本地部署DeepSeek等大模型时,会需要用到Dify来帮我们快捷的开发和应用。 大家可以参考学习它的中…...
爬蟲動態IP代理與數據採集穩定性
對於從事爬蟲開發的人來說,IP代理的使用直接影響了爬蟲的效率和穩定性。爬蟲的本質是模擬用戶訪問網站,通過抓取網頁內容來獲取所需數據。但大多數網站為了保護自己的數據或防止濫用,會設置諸如IP訪問頻率限制、登錄驗證甚至封禁等反爬蟲措施…...
excel 斜向拆分单元格
右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后,你可以开始输入文字。 需要注意的是,文字并不会自动分成上下两行。 为了达到你期望的效果,你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…...
React Native 实现滑一点点内容区块指示器也滑一点点
效果图如上,内容滑一点点,指示器也按比例话一点点,列表宽度跟数据有关。 实现思路如下: 1.监听列表滑动事件,获取列表横向滑动距离,假设为A; 2.获取列表的宽度,及列表可滑动的宽度…...
解决Vscode项目同时运行两个项目终端无法自动叠加的问题
终端(如命令行工具或服务进程)无法自动“叠加”使用同一资源(如端口号、进程ID等)的核心原因在于操作系统的资源管理机制和网络协议规范的限制。以下是具体分析: 以下是解决 VSCode 同时运行两个项目时终端被前一个占…...
vuex中的state是响应式的吗?
在 Vue.js 中,Vuex 的 state 是响应式的。这意味着当你更改 state 中的数据时,依赖于这些数据的 Vue 组件会自动更新。这是通过 Vue 的响应式系统实现的,该系统使用了 ES6 的 Proxy 对象来监听数据的变化。 当你在 Vuex 中定义了一个 state …...
k8s面试题总结(九)
1.K8s中pod删除失败,有哪些情况?如何解决? Pod删除失败的情况: (1) Pod被其他资源(如Deployment,ReplicaSet)引用,无法删除pod 解决:先删除引用该pod的资源,再删除pod…...
【JQuery—前端快速入门】JQuery 操作元素
JQuery 操作元素 1. 获取/修改元素内容 三个简单的获取元素的方法: 这三个方法即可以获取元素的内容,又可以设置元素的内容. 有参数时,就进行元素的值设置,没有参数时,就进行元素内容的获取. 接下来,我们需…...
三维数据可视化与表面重建:Marching Cubes算法的原理与应用
1. 引言 随着现代医学影像技术的飞速发展,三维数据的可视化与重建已成为医学研究、临床诊断和手术规划的重要工具。在众多三维重建算法中,Marching Cubes算法因其高效、稳定的特性成为从离散数据场中提取等值面的经典方法。本报告将深入探讨Marching Cu…...
网络变压器的主要电性参数与测试方法(2)
Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(2).. 今天我们继续来看看网络变压器的2个主要电性参数与它的测试方法: 1. 线圈间分布电容Cp:线圈间杂散静电容 测试条件:100KHz/0.1…...
端到端自动驾驶——cnn网络搭建
论文参考:https://arxiv.org/abs/1604.07316 demo 今天主要来看一个如何通过图像直接到控制的自动驾驶端到端的项目,首先需要配置好我的仿真环境,下载软件udacity: https://d17h27t6h515a5.cloudfront.net/topher/2016/November…...
# 【Unity】【游戏开发】赛车游戏中碰撞加速的实现方法
背景 在赛车类游戏开发中,常常需要实现赛车在碰撞某些道具或对象后加速的功能。例如,当赛车经过加速带或碰撞加速道具时,速度会瞬间增加,使游戏更具动态性和可玩性。本文将介绍一种通用的实现方式,并分析其逻辑。 分析 加速的核心逻辑如下: 判断碰撞条件:检测赛车是否…...
Dubbo本地服务调试
本地服务之间调试 参考这个文档: Dubbo本地调试 注意事项 本地主服务调用本地另外一个子服务,dubbo端口号与子服务的WEB端口号不一致。要查看子服务dubbo的配置文件,设置的rpc端口号是多少主服务中,最好在dubbo的配置文件&…...
SqlSugar 语法糖推荐方式
//方式1:var dd _repository._Db.Queryable<ConfigAggregateRoot, UserRoleEntity>((o, p) > o.Id p.Id).Select((o, p) > new{o.Id,o.Remark,p.RoleId,});//方式2:不推荐使用,建议优先使用 Lambda 表达式,因为它更…...
爬虫逆向实战小记——解决captcha滑动验证码
注意!!!!某XX网站实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!! IGh0dHBzOi8vY2FwdGNoYS5ydWlqaWUuY29tLmNuLw 第一步: 分析请求网址和响应内容 (1)通过观察,滑…...
printf 与前置++、后置++、前置--、后置-- 的关系
# 前置和前置-- 先看一段代码 大家是不是认为printf输出的是 2 3 3 2 1 1 但是实际输出的是 3 3 3 1 1 1 在这两行printf函数代码里,编译器会先计算 a 和 --a 的值,然后再 从右向左 开始输出。 printf函数中,如果有多个…...
【Web前端开发】---HTML标签及标签属性
1、单标签与双标签 HTML标签分为:双标签、单标签。 例如: <marquee>你好</marquee> 示例: 双标签:<标签名>标签体</标签名> 单标签:<标签名/>(注意:/可以省…...
【大模型系列篇】国产开源大模型DeepSeek-V3技术报告解析
DeepSeek-V3技术报告 目录 DeepSeek-V3技术报告 1. 摘要 2. 引言 3. DeepSeek V3 架构 3.1 基础架构 3.1.1. 多头潜在注意力 3.1.2. DeepSeekMoE和无辅助损失的负载均衡 3.2 多令牌预测 4. 基础设施 4.1 计算集群 4.2 训练框架 4.2.1. DualPipe算法与计算通信协同优…...
【赵渝强老师】监控Redis
对运行状态的Redis实例进行监控是运维管理中非常重要的内容,包括:监控Redis的内存、监控Redis的吞吐量、监控Redis的运行时信息和监控Redis的延时。通过Redis提供的监控命令便能非常方便地实现对各项指标的监控。 一、监控Redis的内存 视频讲解如下 【…...
RocketMQ顺序消费机制
RocketMQ的顺序消费机制通过生产端和消费端的协同设计实现,其核心在于局部顺序性,即保证同一队列(MessageQueue)内的消息严格按发送顺序消费。以下是详细机制解析及关键源码实现: 一、顺序消费的核心机制 1. 生产端路…...
新装的conda 以及pycharm未能正确初始化,或conda环境变量配置错误问题解决!!!
Windows PowerShell 版权所有(C) Microsoft Corporation。保留所有权利。 安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindows PS E:\Dev_project\MyProjects> conda cativate py12 usage: conda-script.py [-h…...
通往 AI 之路:Python 机器学习入门-线性代数
2.1 线性代数(机器学习的核心) 线性代数是机器学习的基础之一,许多核心算法都依赖矩阵运算。本章将介绍线性代数中的基本概念,包括标量、向量、矩阵、矩阵运算、特征值与特征向量,以及奇异值分解(SVD&…...
2025国家护网HVV高频面试题总结来了03(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 0x1 高频面试题第一套 0x2 高频面试题第二套 0x3 高频面试题第三套 0x4高频面试题第四套 0x1 高频面试题…...
内容中台与企业内容管理架构解析
内容中台技术架构解析 内容中台的技术架构以数据资产化和服务API化为核心,通过解耦内容生产与消费环节构建数字化基础设施。其架构通常包含统一内容池、智能处理引擎和开放接口层三大模块:统一内容池通过标准化元数据模型对多源异构内容进行结构化存储&…...
希音(Shein)前端开发面试题集锦和参考答案
用 Node 写过什么工具或 npm 包 在实际开发中,使用 Node 编写过多种实用工具和 npm 包。 自动化构建工具 开发了一个简单的自动化构建工具,用于处理前端项目的资源压缩和合并。在前端项目中,为了优化性能,需要对 CSS 和 JavaScript 文件进行压缩,减少文件体积,同时将多个…...
《一个端粒到端粒的参考基因组为木瓜中五环三萜类化合物生物合成提供了遗传学见解》
A telomere-to-telomere reference genome provides genetic insight into the pentacyclic triterpenoid biosynthesis in Chaenomeles speciosa Amplification of transposable elements 转座元件的扩增 Sequence mining disclosed that TEs were one main event in the ex…...
使用easyocr、PyPDF2对图像及PDF文档进行识别
一、概述 本 Python 脚本的主要功能是对当前目录及其子目录下的图片和 PDF 文件进行光学字符识别(OCR)处理。它使用 easyocr 库处理图片中的文字,使用 PyPDF2 库提取 PDF 文件中的文本,并将处理结果保存为文本文件。同时ÿ…...