go的学习笔记

server/2024/9/20 3:12:55/ 标签: golang, 学习, 笔记

中文标准库文档:https://studygolang.com/pkgdoc

第一段代码

所有代码的主文件都是main.go,下面的代码直接在项目里面创建main.go运行

package main // 声明文件所在的包,每个go文件必须有归属的包import "fmt" // 引入程序需要的包,为了使用包下的函数,比如Printlnfunc main() { // 程序的主函数,程序的运行入口fmt.Println("Hello World")  // 在控制台打印输出一句话
}

如果是vscode等工具需要执行go run main.go来运行,我这里使用的是goLand右键直接运行了

注意事项:

  • 源文件以.go为扩展名
  • 程序的执行入口是main()函数
  • 严格区分大小写
  • 方法由一条条语句构成,每个语句后面不需要加分号,这也体现出go的简洁性
  • Go编译器是一行行进行编译的,因此一行就写一条语句,不能把多个语句写在同一行,否则报错
  • 定义的变量或者import的包如果没有使用到,代码不能编译通过
  • 大括号都是成对出现的,缺一不可

变量的定义和使用

package mainimport "fmt"// 全局变量: 定义在函数外的变量
var n9 = 100
var n10 = 9.7// 一次性定义多个全局变量
var (n11 = 12n12 = "你好"
)func main() {// 定义在{}中的变量叫: 局部变量// 变量重复定义会报错var name string   // 声明变量和类型name = "小明"       // 赋值变量fmt.Println(name) // 打印值var age int = 18 // 声明变量和类型并赋值fmt.Println(age)var address = "北京" // 声明没指定类型时,根据后面的值的类型自动推断类型//address = 12 // 报错,因为上面类型推断为stringfmt.Println(address)stuName := "萧寂"                 // 声明和赋值fmt.Println("学生姓名为: ", stuName) // 打印值//count = 1  // 不能直接写等于号,除非:=或者var count = 1  必须要声明fmt.Println("--------------------------------------------")// 声明多个变量不赋值var n1, n2, n3 intfmt.Println(n1, n2, n3) // 不赋值情况下会打印每个类型的原始值// 声明多个变量并赋值var n4, n5, n6 = 14, "jack", 12.7fmt.Println(n4, n5, n6) // 声明多个变量并赋值n7, n8 := 12, "hahaha"fmt.Println(n7, n8)// 打印全局变量fmt.Println(n9, n10, n11, n12)
}

数据类型介绍

  • 基本数据类型
    • 数值型
      • 整数类型(int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,byte)
      • 浮点类型(float32,float64)
    • 字符型(没有单独的字符型,使用byte来保存单个字母字符)
    • 布尔型(bool)
    • 字符串(string)
  • 派生数据类型(也是复杂数据类型)
    • 指针
    • 数组
    • 结构体
    • 管道
    • 函数
    • 切片
    • 接口
    • map

整数类型

package mainimport ("fmt""unsafe"
)func main() {//	整数类型// 定义一个整数类型//var num1 int8 = 230 // 报错(230超出int8范围)//fmt.Println(num1)// 定义整数类型var num2 = -20fmt.Println(num2)// 打印类型// 其他占位符的使用: https://www.jianshu.com/p/66aaf908045efmt.Printf("num2的类型是: %T", num2)fmt.Println()                    // 换行作用fmt.Println(unsafe.Sizeof(num2)) // 打印字节数// 定义byte类型var num3 byte = 20fmt.Println(num3)
}

浮点类型

package mainimport "fmt"func main() {//	定义浮点类型的数据var num1 float32 = 3.14var num2 float64 = 3.15fmt.Println(num1, num2)
}

字符类型

package mainimport "fmt"func main() {// 定义字符类型的数据var c1 byte = 'a'var c2 byte = 'b'var c3 byte = '('var c4 byte = '6'var c5 int = '中' // 底层是Unicode编码fmt.Println(c1, c2, c3, c4, c5)
}

布尔类型

package mainimport "fmt"func main() {//	测试布尔类型的数值var flag1 bool = truevar flag2 bool = falsevar flag3 = 5 < 9fmt.Println(flag1, flag2, flag3)
}

字符串类型

package mainimport "fmt"func main() {//	测试布尔类型的数值var str string = "你好"var str2 string = "世界"fmt.Println(str)fmt.Println(str+str2)
}

基本数据类型之间的转换

package main
import "fmt"
func main(){//进行类型转换:var n1 int = 100//var n2 float32 = n1  在这里自动转换不好使,比如显式转换fmt.Println(n1)//fmt.Println(n2)var n2 float32 = float32(n1)fmt.Println(n2)//注意:n1的类型其实还是int类型,只是将n1的值100转为了float32而已,n1还是int的类型fmt.Printf("%T",n1)  //intfmt.Println()//将int64转为int8的时候,编译不会出错的,但是会数据的溢出var n3 int64 = 888888var n4 int8 = int8(n3)fmt.Println(n4)//56var n5 int32 = 12var n6 int64 = int64(n5) + 30  //一定要匹配=左右的数据类型fmt.Println(n5)fmt.Println(n6)var n7 int64 = 12var n8 int8 = int8(n7) + 127  //编译通过,但是结果可能会溢出//var n9 int8 = int8(n7) + 128 //编译不会通过fmt.Println(n8)//fmt.Println(n9)
}

基本数据类型转string

package main
import "fmt"
func main(){var n1 int = 19var n2 float32 = 4.78var n3 bool = falsevar n4 byte = 'a'var s1 string = fmt.Sprintf("%d",n1)fmt.Printf("s1对应的类型是:%T ,s1 = %q \n",s1, s1)var s2 string = fmt.Sprintf("%f",n2)fmt.Printf("s2对应的类型是:%T ,s2 = %q \n",s2, s2)var s3 string = fmt.Sprintf("%t",n3)fmt.Printf("s3对应的类型是:%T ,s3 = %q \n",s3, s3)var s4 string = fmt.Sprintf("%c",n4)fmt.Printf("s4对应的类型是:%T ,s4 = %q \n",s4, s4)
}

string转基本数据类型

package mainimport ("fmt""strconv"
)func main() {//string-->boolvar s1 string = "true"var b bool//ParseBool这个函数的返回值有两个:(value bool, err error)//value就是我们得到的布尔类型的数据,err出现的错误//我们只关注得到的布尔类型的数据,err可以用_直接忽略b, _ = strconv.ParseBool(s1)fmt.Printf("b的类型是:%T,b=%v \n", b, b)//string---》int64var s2 string = "19"var num1 int64num1, _ = strconv.ParseInt(s2, 10, 64)fmt.Printf("num1的类型是:%T,num1=%v \n", num1, num1)//string-->float32/float64var s3 string = "3.14"var f1 float64f1, _ = strconv.ParseFloat(s3, 64)fmt.Printf("f1的类型是:%T,f1=%v \n", f1, f1)//注意:string向基本数据类型转换的时候,一定要确保string类型能够转成有效的数据类型,否则最后得到的结果就是按照对应类型的默认值输出var s4 string = "golang"var b1 boolb1, _ = strconv.ParseBool(s4)fmt.Printf("b1的类型是:%T,b1=%v \n", b1, b1)var s5 string = "golang"var num2 int64num2, _ = strconv.ParseInt(s5, 10, 64)fmt.Printf("num2的类型是:%T,num2=%v \n", num2, num2)
}

指针

package mainimport ("fmt"
)func main() {var age int = 18//&符号+变量 就可以获取这个变量内存的地址fmt.Println(&age) //0xc0000a2058//定义一个指针变量://var代表要声明一个变量//ptr 指针变量的名字//ptr对应的类型是:*int 是一个指针类型 (可以理解为 指向int类型的指针)//&age就是一个地址,是ptr变量的具体的值var ptr *int = &agefmt.Println(ptr)fmt.Println("ptr本身这个存储空间的地址为:", &ptr)//想获取ptr这个指针或者这个地址指向的那个数据:fmt.Printf("ptr指向的数值为:%v", *ptr) //ptr指向的数值为:18
}

运算符

算术运算符

package mainimport "fmt"func main() {//+加号://1.正数 2.相加操作  3.字符串拼接var n1 int = +10fmt.Println(n1)var n2 int = 4 + 7fmt.Println(n2)var s1 string = "abc" + "def"fmt.Println(s1)// /除号:fmt.Println(10 / 3)   //两个int类型数据运算,结果一定为整数类型fmt.Println(10.0 / 3) //浮点类型参与运算,结果为浮点类型// % 取模  等价公式: a%b=a-a/b*bfmt.Println(10 % 3) // 10%3= 10-10/3*3 = 1fmt.Println(-10 % 3)fmt.Println(10 % -3)fmt.Println(-10 % -3)//++自增操作:var a int = 10a++fmt.Println(a)a--fmt.Println(a)//++ 自增 加1操作,--自减,减1操作//go语言里,++,--操作非常简单,只能单独使用,不能参与到运算中去//go语言里,++,--只能在变量的后面,不能写在变量的前面 --a  ++a  错误写法
}

赋值运算符

package mainimport "fmt"func main() {var num1 int = 10fmt.Println(num1)var num2 int = (10+20)%3 + 3 - 7 //=右侧的值运算清楚后,再赋值给=的左侧fmt.Println(num2)var num3 int = 10num3 += 20 //等价num3 = num3 + 20;fmt.Println(num3)//练习:交换两个数的值并输出结果:var a int = 8var b int = 4fmt.Printf("a = %v,b = %v", a, b)//交换://引入一个中间变量:var t intt = aa = bb = tfmt.Printf("a = %v,b = %v", a, b)
}

关系运算符

package mainimport "fmt"func main() {fmt.Println(5 == 9) //判断左右两侧的值是否相等,相等返回true,不相等返回的是false, ==不是=fmt.Println(5 != 9) //判断不等于fmt.Println(5 > 9)fmt.Println(5 < 9)fmt.Println(5 >= 9)fmt.Println(5 <= 9)
}

逻辑运算符

package mainimport "fmt"func main() {//与逻辑:&& :两个数值/表达式只要有一侧是false,结果一定为false//也叫短路与:只要第一个数值/表达式的结果是false,那么后面的表达式等就不用运算了,直接结果就是false  -->提高运算效率fmt.Println(true && true)fmt.Println(true && false)fmt.Println(false && true)fmt.Println(false && false)//或逻辑:||:两个数值/表达式只要有一侧是true,结果一定为true//也叫短路或:只要第一个数值/表达式的结果是true,那么后面的表达式等就不用运算了,直接结果就是true -->提高运算效率fmt.Println(true || true)fmt.Println(true || false)fmt.Println(false || true)fmt.Println(false || false)//非逻辑:取相反的结果:fmt.Println(!true)fmt.Println(!false)
}

获取用户终端输入数据

package mainimport "fmt"func main() {//实现功能:键盘录入学生的年龄,姓名,成绩,是否是VIP//方式1:Scanlnvar age int// fmt.Println("请录入学生的年龄:")//传入age的地址的目的:在Scanln函数中,对地址中的值进行改变的时候,实际外面的age被影响了//fmt.Scanln(&age)//录入数据的时候,类型一定要匹配,因为底层会自动判定类型的var name string// fmt.Println("请录入学生的姓名:")// fmt.Scanln(&name)var score float32// fmt.Println("请录入学生的成绩:")// fmt.Scanln(&score)var isVIP bool// fmt.Println("请录入学生是否为VIP:")// fmt.Scanln(&isVIP)//将上述数据在控制台打印输出://fmt.Printf("学生的年龄为:%v,姓名为:%v,成绩为:%v,是否为VIP:%v",age,name,score,isVIP)//方式2:Scanffmt.Println("请录入学生的年龄,姓名,成绩,是否是VIP,使用空格进行分隔")fmt.Scanf("%d %s %f %t", &age, &name, &score, &isVIP)//将上述数据在控制台打印输出:fmt.Printf("学生的年龄为:%v,姓名为:%v,成绩为:%v,是否为VIP:%v", age, name, score, isVIP)
}

流程控制语句

if语句

单分支

package main
import "fmt"
func main(){//实现功能:如果口罩的库存小于30个,提示:库存不足://var count int = 100//单分支:// if count < 30 {// 	fmt.Println("对不起,口罩存量不足")// }//if后面表达式,返回结果一定是true或者false,//如果返回结果为true的话,那么{}中的代码就会执行//如果返回结果为false的话,那么{}中的代码就不会执行//if后面一定要有空格,和条件表达式分隔开来//{}一定不能省略//条件表达式左右的()是建议省略的//在golang里,if后面可以并列的加入变量的定义:if count := 20;count < 30 {fmt.Println("对不起,口罩存量不足")}
}

双分支

package mainimport "fmt"func main() {//实现功能:如果口罩的库存小于30个,提示:库存不足,否则提示:库存充足//定义口罩的数量:var count int = 70if count < 30 { //这个条件表达式返回的是true的话,后面{}执行了fmt.Println("库存不足")} else { //count >= 30fmt.Println("库存充足")}//双分支一定会二选一走其中一个分支。}

多分支

package mainimport "fmt"func main() {//实现功能:根据给出的学生分数,判断学生的等级:// >=90  -----A// >=80  -----B// >=70  -----C// >=60  -----D// <60   -----E//方式1:利用if单分支实现://定义一个学生的成绩:var score int = 18//对学生的成绩进行判定:// if score >= 90 {// 	fmt.Println("您的成绩为A级别")// }// if score >= 80 && score < 90 {// 	fmt.Println("您的成绩为B级别")// }// if score >= 70 && score < 80 {// 	fmt.Println("您的成绩为C级别")// }// if score >= 60 && score < 70 {// 	fmt.Println("您的成绩为D级别")// }// if score < 60 {// 	fmt.Println("您的成绩为E级别")// }//上面方式1利用多个单分支拼凑出多个选择,多个选择是并列的,依次从上而下顺序执行,即使走了第一个分支,那么其它分支也是需要判断//方式2:多分支:优点:如果已经走了一个分支了,那么下面的分支就不会再去判断执行了// if score >= 90 {// 	fmt.Println("您的成绩为A级别")// } else if score >= 80 {//else隐藏:score < 90// 	fmt.Println("您的成绩为B级别")// } else if score >= 70 {//score < 80// 	fmt.Println("您的成绩为C级别")// } else if score >= 60 {//score < 70// 	fmt.Println("您的成绩为D级别")// } else {//score < 60// 	fmt.Println("您的成绩为E级别")// } //建议你保证else的存在,只有有了else才会真正 起到多选一 的效果if score > 10 {fmt.Println("aaa")} else if score > 6 {fmt.Println("bbb")}
}

switch语句

package mainimport "fmt"func main() {//实现功能:根据给出的学生分数,判断学生的等级:// >=90  -----A// >=80  -----B// >=70  -----C// >=60  -----D// <60   -----E//给出一个学生分数:var score int = 187//根据分数判断等级://switch后面是一个表达式,这个表达式的结果依次跟case进行比较,满足结果的话就执行冒号后面的代码。//default是用来“兜底”的一个分支,其它case分支都不走的情况下就会走default分支//default分支可以放在任意位置上,不一定非要放在最后。switch score / 10 {case 10:fmt.Println("您的等级为A级")case 9:fmt.Println("您的等级为A级")case 8:fmt.Println("您的等级为B级")case 7:fmt.Println("您的等级为C级")case 6:fmt.Println("您的等级为D级")case 5:fmt.Println("您的等级为E级")case 4:fmt.Println("您的等级为E级")case 3:fmt.Println("您的等级为E级")case 2:fmt.Println("您的等级为E级")case 1:fmt.Println("您的等级为E级")case 0:fmt.Println("您的等级为E级")default:fmt.Println("您的成绩有误")}}

注意事项:

  • switch后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以)
  • case后面的值如果是常量值(字面量),则要求不能重复
  • case后的各个值的数据类型,必须和 switch 的表达式数据类型一致
  • case后面可以带多个值,使用逗号间隔。比如 case 值1,值2…
  • case后面不需要带break
  • default语句不是必须的,位置也是随意的。
  • switch后也可以不带表达式,当做if分支来使用
  • switch后也可以直接声明/定义一个变量,分号结束,不推荐
  • switch穿透,利用fallthrough关键字,如果在case语句块后增加fallthrough ,则会继续执行下一个case,也叫switch穿透。

循环

for循环

go语言只有for循环

package mainimport "fmt"func main() {//实现一个功能:求和: 1+2+3+4+5://求和://利用for循环来解决问题:var sum int = 0for i := 1; i <= 5; i++ {sum += i}//输出结果:fmt.Println(sum)// for循环的语法格式:// for 初始表达式; 布尔表达式(条件判断); 迭代因子 {// 	循环体;--》反复重复执行的内容// }// 注意:for的初始表达式 不能用var定义变量的形式,要用:=// 注意:for循环实际就是让程序员写代码的效率高了,但是底层该怎么执行还是怎么执行的,底层效率没有提高,只是程序员写代码简洁了而已
}

细节1:格式灵活

package mainimport "fmt"func main() {i := 1       //变量的初始化for i <= 5 { //条件表达式。判断条件fmt.Println("你好 Golang") //循环体i++                      //迭代}
}

细节2:死循环

package mainimport "fmt"func main() {//死循环:// for {// 	fmt.Println("你好 Golang")// }for {fmt.Println("你好 Golang")}
}

for renge键值对循环

(键值循环) for range结构是Go语言特有的一种的迭代结构,在许多情况下都非常有用,for range 可以遍历数组、切片、字符串、map 及通道,for range 语法上类似于其它语言中的 foreach 语句

package mainimport "fmt"func main() {//定义一个字符串:var str string = "hello golang你好"//方式1:普通for循环:按照字节进行遍历输出的 (暂时先不使用中文)// for i := 0;i < len(str);i++ {//i:理解为字符串的下标// 	fmt.Printf("%c \n",str[i])// }//方式2:for rangefor i, value := range str {fmt.Printf("索引为:%d,具体的值为:%c \n", i, value)}//对str进行遍历,遍历的每个结果的索引值被i接收,每个结果的具体数值被value接收//遍历对字符进行遍历的
}

关键字

break

  • switch分支中,每个case分支后都用break结束当前分支,但是在go语言中break可以省略不写。
  • break可以结束正在执行的循环
  • break的作用结束离它最近的循环
package main
import "fmt"
func main(){//功能:求1-100的和,当和第一次超过300的时候,停止程序var sum int = 0for i := 1 ; i <= 100 ; i++ {sum += ifmt.Println(sum)if sum >= 300 {//停止正在执行的这个循环:break }}fmt.Println("-----ok")
}

深入理解

package main
import "fmt"
func main(){//双重循环:for i := 1; i <= 5; i++ {for j := 2; j <= 4; j++ {fmt.Printf("i: %v, j: %v \n",i,j)if i == 2 && j == 2 {break}}}
}

标签的使用展示

package mainimport "fmt"func main() {//双重循环:
label2:for i := 1; i <= 5; i++ {for j := 2; j <= 4; j++ {fmt.Printf("i: %v, j: %v \n", i, j)if i == 2 && j == 2 {break label2 //结束指定标签对应的循环}}}fmt.Println("-----ok")
}

continue

  • continue的作用是结束离它近的那个循环,继续离它近的那个循环
package main
import "fmt"
func main(){//功能:输出1-100中被6整除的数://方式1:// for i := 1; i <= 100; i++ {// 	if i % 6 == 0 {// 		fmt.Println(i)// 	}// }//方式2:for i := 1; i <= 100; i++ {if i % 6 != 0 {continue //结束本次循环,继续下一次循环}fmt.Println(i)}
}

深入理解

package main
import "fmt"
func main(){//双重循环:for i := 1; i <= 5; i++ {for j := 2; j <= 4; j++ {			if i == 2 && j == 2 {continue}fmt.Printf("i: %v, j: %v \n",i,j)}}fmt.Println("-----ok")
}

标签的使用展示

package mainimport "fmt"func main() {//双重循环:
label:for i := 1; i <= 5; i++ {for j := 2; j <= 4; j++ {if i == 2 && j == 2 {continue label}fmt.Printf("i: %v, j: %v \n", i, j)}}fmt.Println("-----ok")
}

goto

  • Golang的 goto 语句可以无条件地转移到程序中指定的行。
  • goto语句通常与条件语句配合使用。可用来实现条件转移.
  • 在Go程序设计中一般不建议使用goto语句,以免造成程序流程的混乱。
package mainimport "fmt"func main() {fmt.Println("hello golang1")fmt.Println("hello golang2")if 1 == 1 {goto label1 //goto一般配合条件结构一起使用}fmt.Println("hello golang3")fmt.Println("hello golang4")fmt.Println("

http://www.ppmy.cn/server/119246.html

相关文章

Django创建模型

1、根据创建好应用模块 python manage.py startapp tests 2、在models文件里创建模型 from django.db import modelsfrom book.models import User# Create your models here. class Tests(models.Model):STATUS_CHOICES ((0, 启用),(1, 停用),# 更多状态...)add_time mode…

tp6.0.8反序列化漏洞的一些看法

更多漏洞分析的内容&#xff0c;可前往无问社区查看http://www.wwlib.cn/index.php/artread/artid/5741.html 环境搭建 composer create-project topthink/think6.0.x-dev thinkphp-v6.0 首先构造一个反序列化点 app/controller/Index.php <?php namespace app\contro…

数据结构之哈希表

哈希表(散列表) 出现的原因 在顺序表中查找时&#xff0c;需要从表头开始&#xff0c;依次遍历比较a[i]与key的值是否相等&#xff0c;直到相等才返回索引i&#xff1b;在有序表中查找时&#xff0c;我们经常使用的是二分查找&#xff0c;通过比较key与a[i]的大小来折半查找&…

Python学习——【2.1】if语句相关语法

文章目录 【2.1】if语句相关一、布尔类型和比较运算符&#xff08;一&#xff09;布尔类型&#xff08;二&#xff09;比较运算符 二、if语句的基本格式※、练习 三、if-else组合判断语句※、练习 四、if-elif-else多条件判断语句※、练习 五、判断语句的嵌套※、实战案例 【2.…

非暴力沟通

非暴力沟通是一种有效的沟通方式&#xff0c;它可以帮助我们避免语言和行为上的暴力&#xff0c;提升人际关系的质量。这种沟通方式基于四个基本步骤&#xff1a;观察、感受、需要和请求。下面我们将详细探讨这四个步骤。 观察 观察是非暴力沟通的第一个步骤&#xff0c;它要…

Quartus sdc UI界面设置(二)

Quartus sdc设置 根据一配置quartus综合简单流程&#xff08;一&#xff09; 上次文章中&#xff0c;说了自己写sdc需要配置的分类点&#xff0c;这次将说明在UI界面配置sdc。 1. 在Quartus软件中&#xff0c;导入verilog设计之后&#xff0c;打开Tools/TimeQuest Timing Ana…

在网络环境中怎么保护个人信息安全?

在网络环境中保护个人信息安全非常重要&#xff0c;以下是一些基本的建议来帮助您保护自己的个人信息&#xff1a; 使用强密码&#xff1a;确保您的所有在线账户都使用强密码。强密码通常包含大写字母、小写字母、数字以及特殊字符&#xff0c;并且长度至少为12位以上。 启用双…

ASPICE培训:打造卓越的汽车软件开发能力

随着汽车行业的快速发展和智能化技术的不断演进&#xff0c;汽车软件开发已成为汽车制造过程中不可或缺的一部分。为了确保汽车软件的质量、可靠性和安全性&#xff0c;ASPICE&#xff08;Automotive SPICE&#xff09;作为一种国际公认的汽车软件开发过程评估标准&#xff0c;…

Docker安装 ▎Docker详细讲解 ▎数据卷挂载 ▎Nginx安装理解

前言 Docker是一种容器化技术&#xff0c;简化软件的部署和管理。文章详细解释了Docker的架构、安装步骤和常用命令&#xff0c;帮助用户快速启动和管理容器。还介绍了Docker镜像命令和数据卷挂载的实例&#xff0c;增强对持久化存储的理解&#xff0c;并涵盖了Nginx的安装方法…

红帽9中nginx-源码编译php

什么是PHP-FPM&#xff1f; PHP-FPM(FastCGI Process Manager&#xff1a; FastCGI进程管理器)是一个实现了Fastcgi的程序&#xff0c;并且提供进程管理的功能。 进程包括master进程和worker进程。master进程只有一个&#xff0c;负责监听端口&#xff0c;接受来自web server 的…

34.贪心算法1

0.贪心算法 1.柠檬水找零&#xff08;easy&#xff09; . - 力扣&#xff08;LeetCode&#xff09; 题目解析 算法原理 代码 class Solution {public boolean lemonadeChange(int[] bills) {int five 0, ten 0;for (int x : bills) {if (x 5) // 5 元&#xff1a;直接收下…

初次加载资源时无法正常加载,需要多次刷新、请求才能拿到资源的有效解决方案

初次加载资源时无法正常加载&#xff0c;需要多次刷新、请求才能拿到资源的有效解决方案 前言 在使用cloudinary进行图片上传并获取图片链接作为用户头像时发现&#xff0c;图片链接网址初次加载会报错&#xff1a;ERR_CONNECTION_RESET必须刷新几次才能获取到&#xff0c;原…

望繁信科技携流程智能解决方案亮相CNDS 2024新能源产业数智峰会

9月13日&#xff0c;CNDS 2024中国新能源产业数智峰会在北京圆满落幕。本次峰会以“走向数字新能源”为主题&#xff0c;汇聚了来自新能源领域的顶尖领袖、专家学者及知名企业代表&#xff0c;共同探讨数字化技术在新能源行业中的创新应用和发展趋势。上海望繁信科技有限公司&a…

计算机视觉硬件知识点整理(三):镜头

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、镜头的基础知识与类型二、镜头知识点总结&#xff1a;2.1 光圈2.2 景深2.3 调制传递函数&#xff1a;2.4 视场角2.5 焦距2.6 滤光片 前言 在这个信息化飞速…

1、vectorCast单元测试常用操作

一、自动创建测试工程 1、设置工作目录 进入软件主页面,点击file,选择set working directory,随便选择一个保存该项目的目录即可。 2、创建一个空工程 编译器选择vector自带的编译器,vectorCast MinGW C。 此时项目工程就创建好了 2.1、配置编译器节点 点击编译器节点…

如何使用Launch4J将我们jar包变成一个可执行文件exe

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏 支持一下博主吧~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境二、Launch4J的安装下载三、如何进行配置和生成3.1 基础设置3.2 header设置3.3 jre设置四、常用功能界面大致介绍4.…

DevOps -分布式追踪与监控

DevOps中的分布式追踪与监控 在当今的DevOps环境中&#xff0c;随着微服务架构和云原生应用的广泛采用&#xff0c;系统复杂性显著增加&#xff0c;传统的监控方式已经无法满足现代分布式系统的需求。为了提高系统可观测性&#xff0c;分布式追踪和监控成为现代DevOps实践中至…

后端开发刷题 | 把数字翻译成字符串(动态规划)

描述 有一种将字母编码成数字的方式&#xff1a;a->1, b->2, ... , z->26。 现在给一串数字&#xff0c;返回有多少种可能的译码结果 数据范围&#xff1a;字符串长度满足 0<n≤90 进阶&#xff1a;空间复杂度 O(n)&#xff0c;时间复杂度 O(n) 示例1 输入&a…

微服务架构详解

微服务与SOA概述 SOA历史 SOA示例 微服务历史 SOA 被抛弃了么? 微服务与 SOA 剖析 SOA 架构剖析 ESB就是一个一个微服务的功能 ESB 功能举例 对象转换还有逻辑转换 很多东西都要在ESB里面处理 微服务剖析 把一个单体结构拆分多个小服务。为了让小服务之间通信方便&#x…

Android SPN/PLMN 显示逻辑简介

功能描述 当设备驻网后(运营商网络),会在状态栏、锁屏界面、下拉控制中心显示运营商的名称。 此名称来源有两种: 1、SPN(Service Provider Name) 2、PLMN (Public Land Mobile Name) 功能AOSP默认逻辑SPN提供SIM卡的运营商名称预置在SIM EF中,SIM卡发行运营商名称…