Go后端开发 -- main函数 变量 常量 函数
Go后端开发 – main函数 & 变量 & 常量 & 函数
文章目录
- Go后端开发 -- main函数 & 变量 & 常量 & 函数
- 一、第一个main函数
- 1.创建工程
- 2.main函数解析
- 二、变量声明
- 1.单变量声明
- 2.多变量声明
- 三、常量
- 1.常量的定义
- 2.优雅的常量 iota
- 四、函数
- 1.函数返回多个值
- 2.init函数与import本地导包
- 3.import匿名导包和别名导包
- 4.import导入的包不在同一个路径下
- 5.函数参数
- 5.1.值传递
- 5.2.引用传递(指针传递)
一、第一个main函数
1.创建工程
在$GOPATH/src
目录下创建一个hello.go
文件:
输入以下代码:
package main //程序的包名
//只要包含main函数的文件,就是main包
//main是主包,与工程文件名没有任何关系/*
import "fmt" //导入格式化的包
import "time"
*///也可以一块导入包,导入多个包建议这种方案
import ("fmt""time"
)func main() { // 函数的}一定和函数名在一行,否则编译报错fmt.Println("hello Go!")time.Sleep(1 * time.Second)
}
终端运行:
go run
表示直接编译go语言并执行应用程序,一步完成;
也可以通过go build
先编译,然后再执行:
2.main函数解析
- 第一行代码
package main
定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main
。package main
表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。 - 下一行
import "fmt"
告诉 Go 编译器这个程序需要使用fmt
包(的函数,或其他元素),fmt
包实现了格式化 IO(输入/输出)的函数。 - 下一行
func main()
是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。
注意:这里面go语言的语法,定义函数的时候,‘{’ 必须和函数名在同一行,不能另起一行。 - 注释,单行注释是最常见的注释形式,你可以在任何地方使用以
//
开头的单行注释。多行注释也叫块注释,均已以/*
开头,并以*/
结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。 - 下一行
fmt.Println(...)
可以将字符串输出到控制台,并在最后自动增加换行字符 \n。 使用 fmt.Print(“hello, world\n”) 可以得到相同的结果。Print
和Println
这两个函数也支持使用变量,如:fmt.Println(arr)。如果没有特别指定,它们会以默认的打印格式将变量 arr 输出到控制台。 - go语言的语法中,加不加
;
都可以,建议不加 - 导入多个包的时候建议以下这种语法:
二、变量声明
1.单变量声明
声明变量的一般形式是使用var
关键字;
- 第一种:指定变量类型,声明后若不赋值,使用默认值0。
var v_name v_type
v_name = value
var v_name v_type = value
package mainimport "fmt"func main() {var a int = 5fmt.Printf("a = %d\n", a)
}
- 第二种:根据值自行判定变量类型
var v_name = value
package mainimport "fmt"func main() {var b = 10fmt.Printf("b = %d\n", b)
}
- 第三种,省略var, 注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误(最常用)
v_name := value
:=
表示既初始化,又赋值
package mainimport "fmt"func main() {//var a int = 5//var b = 10a := 10fmt.Printf("a = %d\n", a)
}
- 全局变量的声明
package mainimport "fmt"var a int = 100
var b = "abc"// 这种分解的写法,一般用于声明全局变量
var (c intd bool
)func main() {fmt.Println("a = ", a)fmt.Println("b = ", b)
}
使用var
可以声明全局变量;
package mainimport "fmt"var a int = 100
var b = "abc"c := 1.2func main() {fmt.Println("a = ", a)fmt.Println("b = ", b)fmt.Println("c = ", c)
}
使用:=
不可以声明全局变量,只能够在函数体内使用;
- 可以使用
%T
格式化输出变量的类型
package mainimport "fmt"func main() {//默认值var a intfmt.Printf("a = %d\n", a)fmt.Printf("type of a = %T\n", a)var b int = 10fmt.Printf("b = %d\n", b)fmt.Printf("type of b = %T\n", b)var c = "golang"fmt.Printf("c = %s\n", c)fmt.Printf("type of c = %T\n", c)d := 20.15fmt.Printf("d = %f\n", d)fmt.Printf("type of d = %T\n", d)
}
2.多变量声明
- 方法一:
var c, d int = 1, 2
- 方法二:
var e, f = 123, "Golang"
- 方法三:
g, h := 333, "需要在函数体内实现"
- 方法四:
- 可以使用
_
来接受赋值,表示赋值被废弃,_
不具备读特性
package mainimport "fmt"var x, y int// 这种分解的写法,一般用于声明全局变量
var (a intb bool
)var c, d int = 1, 2
var e, f = 123, "Golang"//这种不带声明格式的只能在函数体内声明
//g, h := 123, "需要在func函数体内实现"func main() {g, h := 333, "需要在函数体内实现"//hfmt.Println(x, y, a, b, c, d, e, f, g, h)//不能对g变量再次做初始化声明//g := 400_, value := 7, 5 实际上7的赋值被废弃,变量 _ 不具备读特性//fmt.Println(_)fmt.Println(value)var (vv int = 15cc bool = false)fmt.Println(vv, cc)
}
三、常量
1.常量的定义
常量是一个简单值的标识符,在程序运行时,不会被修改的量。
常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。
- 常量的定义格式:
const identifier [type] = value
你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。
//显式类型定义
const b string = "abc"
//隐式类型定义:
const b = "abc"
例如:
package mainimport "fmt"func main() {const LENGTH int = 10const WIDTH int = 5var area intconst a, b, c = 1, false, "golang"area = LENGTH * WIDTHfmt.Println("面积为:", area)fmt.Println(a, b, c)
}
- 常量还可以用作枚举类型:
const (UNKNOW = 0FEMALE = 1MALE = 2
)
数字 0、1 和 2 分别代表未知性别、女性和男性。
- 常量可以用
len(), cap(), unsafe.Sizeof()
常量计算表达式的值。常量表达式中,函数必须是内置函数,否则编译不过:
package mainimport ("fmt""unsafe"
)const (a = "golang"b = len(a)c = unsafe.Sizeof(a)
)func main() {fmt.Println(a, b, c)
}
unsafe.Sizeof(a)
输出的结果是16 。
字符串类型在 go 里是个结构, 包含指向底层数组的指针和长度,这两部分每部分都是 8 个字节,所以字符串类型大小为 16 个字节。
2.优雅的常量 iota
有些概念有名字,并且有时候我们关注这些名字,甚至(特别)是在我们代码中。
const (CCVisa = "Visa"CCMasterCard = "MasterCard"CCAmericanExpress = "American Express"
)
在其他时候,我们仅仅关注能把一个东西与其他的做区分。有些时候一件事没有本质上的意义。比如,我们在一个数据库表中存储产品,我们可能不想以 string 存储他们的分类。我们不关注这个分类是怎样命名的,此外,该名字在市场上一直在变化,我们仅仅关注它们是怎么彼此区分的。
const (CategoryBooks = 0CategoryHealth = 1CategoryClothing = 2
)
使用 0, 1, 和 2 代替,我们也可以选择 17, 43, 和 61。这些值是任意的
在 Go,常量有许多微妙之处。当用好了,可以使得代码非常优雅且易维护的。
自增长
- 在 golang 中,一个方便的习惯就是使用
iota
标示符,它简化了常量用于增长数字的定义,给以上相同的值以准确的分类。 - 可以在
const()
添加一个关键字iota
,只在第一行添加iota,之后的每行的iota
都会累加1,第一行的iota
默认值是0
const (CategoryBooks = iota // 0CategoryHealth // 1CategoryClothing // 2
)
iota和表达式
iota
可以做更多事情,而不仅仅是 increment。更精确地说,iota
总是用于 increment,但是它可以用于表达式,在常量中的存储结果值。- 每行的iota都会参与表达式
package mainimport ("fmt"
)type Allergen intconst (IgEggs Allergen = 1 << iota // 1 << 0 which is 00000001IgChocolate // 1 << 1 which is 00000010IgNuts // 1 << 2 which is 00000100IgStrawberries // 1 << 3 which is 00001000IgShellfish // 1 << 4 which is 00010000
)func main() {fmt.Println(IgEggs | IgChocolate | IgShellfish)
}
- 这个工作是因为当你在一个const组中仅仅有一个标示符在一行的时候,它将使用增长的iota取得前面的表达式并且再运用它。在 Go 语言的spec中, 这就是所谓的隐性重复最后一个非空的表达式列表.
- 如果你对鸡蛋,巧克力和海鲜过敏,把这些 bits 翻转到 “on” 的位置(从左到右映射 bits)。然后你将得到一个 bit 值
00010011
,它对应十进制的 19。
package mainimport ("fmt"
)type ByteSize float64const (_ = iota // ignore first value by assigning to blank identifierKB ByteSize = 1 << (10 * iota) // 1 << (10 * 1)MBGBTBPBEBZBYB
)func main() {fmt.Println(KB, MB, GB)
}
- 当你在把两个常量定义在一行的时候会发生什么?
package mainimport ("fmt"
)const (Apple, Banana = iota + 1, iota + 2Cherimoya, DurianElderberry, Fig
)func main() {fmt.Println(Apple, Banana, Cherimoya, Durian)
}
- 在下一行增长,而不是立即取得它的引用。
- 如果从中间改变表达式,后面的行也会跟着改变
package mainimport ("fmt"
)const (a, b = iota + 1, iota + 2c, de, fg, h = iota * 2, iota * 3i, j
)func main() {fmt.Println("a = ", a, "b = ", b)fmt.Println("c = ", c, "d = ", d)fmt.Println("e = ", e, "f = ", f)fmt.Println("g = ", g, "h = ", h)fmt.Println("i = ", i, "j = ", j)
}
- iota只能配合const()进行使用,只有在const()中有累加效果
四、函数
1.函数返回多个值
Go函数的定义:
func 函数名(形参1 类型, 形参2 类型, ...) (返回值1类型, 返回值2类型, ...){// 函数体return 返回值1, 返回值2
}
例如:
Go 函数可以返回多个值
- 返回值为匿名
package mainimport "fmt"func swap(x, y string) (string, string) {return y, x
}func main() {a, b := swap("golang", "c++")fmt.Println(a, b)
}
- 返回值有名称
- 有名称的返回值也相当于函数中的形参
- 有名称的返回值需要在函数体中给返回值参数赋值,如果不赋值直接返回值也是可以的
- 没有赋值之前,返回值参数都默认值为0,是作为局部变量来赋值的,作用域为当前函数的{}内
package mainimport "fmt"func prt(a string, b int) (r1 int, r2 int) {fmt.Println("a = ", a)fmt.Println("b = ", b)fmt.Println(r1, r2) // 没赋值之前,r1和r2默认值为0,相当于函数中的形参//给有名称的返回值变量赋值r1 = 1000r2 = 2000return
}func main() {a, b := prt("golang", 123)fmt.Println(a, b)
}
- 各个参数类型或者各个返回值类型都是一样的,可以放到一起声明类型
func swap(x, y string) (r1, r2 string) {return y, x
}
2.init函数与import本地导包
- init 函数可在package main中,可在其他package中,可在同一个package中出现多次。
- main 函数只能在package main中。
执行顺序
- golang里面有两个保留的函数:init函数(能够应用于所有的package)和main函数(只能应用于package main)。这两个函数在定义时不能有任何的参数和返回值。
- 虽然一个package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说,我们都强烈建议用户在一个package中每个文件只写一个init函数。
- init函数是在主程序开始之前做的一些预处理,如加载配置文件,加载数据库的内容,做环境变量的初始化等;
- go程序会自动调用init()和main(),所以你不需要在任何地方调用这两个函数。每个package中的init函数都是可选的,但package main就必须包含一个main函数。
- 程序的初始化和执行都起始于main包。
- 如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没有必要导入多次)。
- 当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。
- 等所有被导入的包都加载完毕了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执行main函数。
- 下图详细地解释了整个执行过程:
例子:
- 代码结构:
- go.mod
module function_gogo 1.20
- Lib1.go
package Initlib1import "fmt"// lib1提供的API
func lib1Test() {fmt.Println("lib1Test()...")
}func init() {fmt.Println("lib1")
}
- Lib2.go
package Initlib2import "fmt"// lib2提供的API
func lib2Test() {fmt.Println("lib2Test()...")
}func init() {fmt.Println("lib2")
}
- main.go
- 在使用Go Modules导入本地包的时候,在包名的前面需要指定模块名才可以导入
比如上面的go.mod
中模块名是function_go
,导入包的路径就是function_go/InitLib1
- 在导入了包之后,需要调用包中的方法,可以直接
包名.方法()
- 在使用Go Modules导入本地包的时候,在包名的前面需要指定模块名才可以导入
package mainimport ("function_go/InitLib1""function_go/InitLib2"
)func main() {InitLib1.Lib1Test()InitLib2.Lib2Test()
}
- 如果要使用GOPATH机制,在
main.go
中使用import
导本地包的时候,一定要在包名前加上该包路径相对于GOPATH
的路径
运行结果
lib1
lib2
libmain init
libmian main
- 如果在Lib1中导入Lib2包,mian包不导入Lib2
package InitLib1import ("fmt""goProject/function_go/InitLib2"
)// lib2提供的API
func lib2Test() {fmt.Println("lib2Test()...")
}func init() {fmt.Println("lib1")
}
输出结果:
lib2
lib1
libmain init
libmian main
main包以及Lib1包都导入了Lib2,但是只出现一次,并且最先输出
-
说明如果一个包会被多个包同时导入,那么它只会被导入一次,而先输出lib2是因为main包中导入Lib1时,Lib1又导入了Lib2,会首先初始化Lib2包的东西
-
如果一个函数名首字母是大写的,说明此函数是对外开放的,如果是小写的,只能在当前包内调用,无法对外开放
3.import匿名导包和别名导包
- 在go中,如果我们导入了一个包,但是没有使用其中的接口,那么编译就会报错;
- 如果我们不想使用包中的接口,但是想导入包执行init函数,我们可以选择匿名导入;
- 在包的路径前加上
_
就代表匿名导入
package mainimport (_ "function_go/InitLib1" //匿名导包_ "function_go/InitLib2"
)func main() {InitLib1.Lib1Test()InitLib2.Lib2Test()
}
- 也可以给导入的包起别名
package mainimport ("function_go/InitLib1"myLib2 "function_go/InitLib2" //给包起别名
)func main() {InitLib1.Lib1Test()myLib2.Lib2Test()
}
- 将包中的内容全部导入当前包
在要导入的包前加.
,表示将包中所有内容导入当前包,可以直接调用方法,不需要在前面指定包名
package mainimport ("goProject/function_go/InitLib1". "goProject/function_go/InitLib2" //将改包所有的方法导入main包
)func main() {InitLib1.Lib1Test()Lib2Test() //直接调用方法
}
4.import导入的包不在同一个路径下
项目结构:
fun_go和function_go是两个不同的模块,如果要在fun_go下的main.go中导入function_go/InitLib1包,也需要指定模块名:
package mainimport ("fmt""function_go/InitLib1" // 指定模块名
)func main() {InitLib1.Lib1Test()fmt.Println("go")
}
5.函数参数
函数如果使用参数,该变量可称为函数的形参;形参就像定义在函数体内的局部变量。
调用函数,可以通过两种方式来传递参数:
5.1.值传递
值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。
以下定义了 swap() 函数:
package mainimport "fmt"func swap(x, y int) {var temp inttemp = xx = yy = temp
}func main() {a := 100b := 200fmt.Println("交换前a的值:", a)fmt.Println("交换前b的值:", b)swap(a, b)fmt.Println("交换后a的值:", a)fmt.Println("交换后b的值:", b)
}
5.2.引用传递(指针传递)
指针
- Go 语言的取地址符是
&
,放到一个变量前使用就会返回相应变量的内存地址。
package mainimport "fmt"func main() {a := 100fmt.Println(&a)
}
- 引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
package mainimport "fmt"func swap(x, y *int) {var temp inttemp = *x*x = *y*y = temp
}func main() {a := 100b := 200fmt.Println("交换前a的值:", a)fmt.Println("交换前b的值:", b)swap(&a, &b)fmt.Println("交换后a的值:", a)fmt.Println("交换后b的值:", b)
}
- golang可以支持二级指针
package mainimport "fmt"func main() {a := 100var p *int = &avar pp **int = &pfmt.Println(&p)fmt.Println(pp)
}
相关文章:

Go后端开发 -- main函数 变量 常量 函数
Go后端开发 – main函数 & 变量 & 常量 & 函数 文章目录 Go后端开发 -- main函数 & 变量 & 常量 & 函数一、第一个main函数1.创建工程2.main函数解析 二、变量声明1.单变量声明2.多变量声明 三、常量1.常量的定义2.优雅的常量 iota 四、函数1.函数返回…...

2023/12/30 c++ work
定义一个Person类,私有成员int age,string &name,定义一个Stu类,包含私有成员double *score,写出两个类的构造函数、析构函数、拷贝构造和拷贝赋值函数,完成对Person的运算符重载(算术运算符、条件运算…...

ctfshow——文件上传
文章目录 文件上传思路web 151web 152web 153知识点解题 web 154web 155web 156web 157web 158web 159web160web 161 文件上传思路 web 151 打开页面显示:前台校验不可靠。说明这题是前端验证。 右键查看源代码,找到与上传点有关的前端代码:…...

【RocketMQ每日一问】RocketMQ SQL92过滤用法以及原理?
1.生产端 public class SQLProducer {public static int count 10;public static String topic "xiao-zou-topic";public static void main(String[] args) {DefaultMQProducer producer MQUtils.createLocalProducer();IntStream.range(0, count).forEach(i -&g…...
Go语言中的包管理工具之Go Path的使用
GoLang 中常用的包管理的方式 1 )概述 常用的有三种 Go PathGo VendorGo Modules 2 )发展历程 早期go的包管理存在很大缺陷,甚至可以说没有官方统一的包管理工具 一方面官方在努力发布一些实验性的包管理工具。同时也出现了很多社区开发…...
cocos creator(2.4.7版本) webview 可以在上层添加UI控件
实现原理:cocos本身在平台中属于view,所以可以把webview放在底层,以达到目标。 实现过程:参考 cocos creator(2.4.7版本) videoplayer 可以在上层添加UI控件() 需要增加以下过程: …...

2023 年四川省职业院校技能大赛“信息安全管理与评估”样题
2023 年四川省职业院校技能大赛(高等职业教育) “信息安全管理与评估”样题 竞赛需要完成三个阶段的任务,分别完成三个模块,总分共计 1000分。三个模块内容和分值分别是: 第一阶段:模块一 网络平台搭建与设…...
ubuntu2204,mysql8.x安装
ubuntu 2204, MySQL8.x安装 sudo apt-get update sudo apt-get upgrade# 习惯性的先设置一下时区,这里我使用东八区 date -R # 若发现时间正常则无需设置tzselect# 依次选择 4 -> 10 -> 1 -> 1cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimedate -R# 同步时间…...

CG Magic分享云渲染和本地渲染之间的区别有什么?
无论是效果图渲染还是影视渲染,对于3D设计师来说都是常见的渲染方式就是云渲染和本地渲染。 本地电脑渲染是指将渲染任务分配给本地计算机进行处理,而云渲染是指将渲染任务上传至云端服务器进行处理。 对于一些初入行业的新手朋友来说,会在想…...

【算法与数据结构】763、LeetCode划分字母区间
文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:本题要求为: 1.尽可能多的划分片段2.字母只能出现在一个片段中3.片段连接起来仍然是s&…...

新火种AI|人形机器人敲响上市罗,首日市值高达390亿港元
作者:一号 编辑:彩云 史上第一次!人形机器人在港交所和人类一起敲锣。 12月29日,在港交所现场,熊猫机器人优悠走上舞台,将手中的锣锤递给了优必选创始人、董事长兼CEO周剑,而同周剑一同准…...

SpringMVC框架
SpringMVC 三层架构MVC模式SpringMVC入门案例总结 三层架构 表现层(web) 页面数据的收集,产出页面 业务逻辑层(service) 业务处理 数据访问层(Dao) 数据持久化 MVC模式 SpringMVC 基于Java…...

FreeRTOS——计数型信号量知识总结及实战
1计数型信号量概念 1)计数型信号量相当于队列长度大于1 的队列,因此计数型信号量能够容纳多个资源 2)适用场景: 事件计数: 当每次事件发生后,在事件处理函数中释放计数型信号量(计数值1&#x…...
Linux下Docker Engine安装后的一些配置步骤
一些安装后的配置令Linux主机可以更好地与Docker配合使用。 0x01 以非root用户身份管理Docker Docker守护进程绑定到Unix套接字,而不是TCP端口。默认情况下,root用户拥有Unix套接字,而其他用户只能使用 sudo. Docker守护进程始终以root用户身份运行。 …...
【并发设计模式】聊聊Balking是如何实现以及具体原理
前面的等待唤醒,其实是一个线程等待执行满足条件的逻辑,会一直死等,但是并不是全部的场景都需要死等。比如我们去坐车的时候,公交一直没来,那么就可以不去了。而等待唤醒是公交没来我就等他来了再去。 Guarded Suspen…...
dubbo的一些问题思考
1.dubbo是啥 Dubbo 是一个高性能的 Java RPC(远程过程调用)框架,用于构建分布式服务架构。由阿里巴巴开发并开源,作为一个分布式服务框架,Dubbo 提供了丰富的功能,包括服务治理、远程调用、负载均衡、容错机…...

盛最多水的容器(力扣11题)
例题: 分析: 这道题给出了一个数组,数组里的元素可以看成每一个挡板,要找到哪两个挡板之间盛的水最多,返回盛水量的最大值。这其实是一个双指针问题。 我们可以先固定第一个挡板( i )和最后一个挡板( j ),…...

.babky勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
导言: 网络安全威胁不断进化,其中.babky勒索病毒引起了广泛关注。这篇文章91数据恢复将深入介绍.babky的狡猾特征,以及在遭受其袭击时如何高效地恢复被加密的数据,并提供实用的预防方法。当面对被勒索病毒攻击导致的数据文件加密…...
20240103-通过布局让自己的生活有有意义人生有价值
最近听到看到的一些词 心力、稀缺、卓有成效、知行合一、致良知、心即理、事上练 最近琢磨出这么一个道理,就是任何人做事情其实都有内心趋势和一套适合他自己的内心驱动的方法。我们经常意识不到,我时常也会去寻求做一件事,是不是有特定的…...

JDK17 - 开发者视角,从 JDK8 ~ JDK17 都增加了哪些新特性
目录 前言 一、站在开发视角,从 JDK8 升级到 JDK17 都有哪些新特性 1.1、JDK8 新特性 1.1.1、Optional 类 a)简介 b)使用方法 c)使用场景 1.2、JDK9 新特性 1.2.1、Optional - ifPresentOrElse 解决 if-else 1.2.2、Opt…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...