【Go的函数】

news2025/1/24 11:34:25

函数

  • 函数的引入
  • 函数细节祥讲
  • 包的引入
  • 包的细节详讲
  • init函数
  • 匿名函数
  • 闭包
  • defer关键字
  • 系统函数
    • 字符串相关函数
    • 日期和时间相关函数
    • 内置函数

函数的引入

【1】为什么要使用函数:
提高代码的复用,减少代码的冗余,代码的维护性也提高了

【2】函数的定义:
为完成某一功能的程序指令(语句)的集合,称为函数。

【3】基本语法

func函数名(形参列表)(返回值类型列表){
    执行语句...
    return  +  返回值列表
}

【4】函数的定义和函数的调用案例:

package main
import "fmt"

// func 函数名(形参列表)(返回值类型列表)
// 执行语句...
// return + 返回值列表
// }

//自定义函数:功能:两个数相加:
func cal(num1 int,num2 int)(int){//如果返回值类型就一个的话,那么()是可以省略不写的
	var sum int = 0
	sum += num1
	sum += num2
	return sum
}
func main(){
//功能:10+20
//调用函数:
sum := cal(10,20)
fmt.Println(sum)
// var num1 int = 10
// var num2 int = 20
//求和:
// var sum int = 0
// sum += num1
// sum += num2
// fmt.Println(sum)

//功能:30+50
var num3 int = 30
var num4 int = 50
//调用函数:
sum1 := cal(num3,num4)
fmt.Println(sum1)
//求和:
// var sum1 int = 0
// sum1 += num3
// sum1 += num4
// fmt.Println(sum1)
}

函数细节祥讲

【1】函数:
对特定的功能进行提取,形成一个代码片段,这个代码片段就是我们所说的函数

【2】函数的作用:提高代码的复用性

【3】函数和函数是并列的关系,所以我们定义的函数不能写到main函数中

【4】基本语法

func  函数名(形参列表)(返回值类型列表){
    执行语句...
    return  +  返回值列表
}

(1)函数名:
遵循标识符命名规范
首字母不能是数字
首字母大写该函数可以被本包文件和其它包文件使用(类似public)
首字母小写只能被本包文件使用,其它包文件不能使用(类似private)

(2)形参列表:
形参列表:个数:可以是一个参数,可以是n个参数,可以是0个参数
形式参数列表:作用:接收外来的数据
实际参数:实际传入的数据
在这里插入图片描述

(3)返回值类型列表:数的返回值对应的类型应该写在这个列表中

返回0个:
在这里插入图片描述
返回1个:
在这里插入图片描述

返回多个:
在这里插入图片描述
在这里插入图片描述

【5】通过例题感受内存分析:

package main
import "fmt"

//自定义函数:功能:交换两个数
func exchangeNum(num1 int,num2 int) {
	var t int
	t = numl
	numl = num2
	num2 = t
}

func main(){
	//调用函数:交换10和20
	var numl int = 10
	var num2 int = 20
	fmt.Printf("交换前的两个数:numl = %v,num2 = %v \n",numl,num2)
	exchangeNum(num1,num2)
	fmt.Printf("交换后的两个数:numl = %v,num2 = %v \n",numl,num2)
}

内存分析:
在这里插入图片描述

【6】Golang中函数不支持重载
在这里插入图片描述

【7】Golang中支持可变参数(如果你希望函数带有可变数量的参数)

package main
import "fmt"

//定义一个函数,函数的参数为:可变参数...参数的数量可变
//args...int  可以传入任意多个数量的int类型的数据  传入0个,1个...n个
func test(args...int){
	//函数内部处理可变参数的时候,将可变参数当做切片来处理
	//遍历可变参数:
	for i := 0; i < len(args); i++ {
		fmt.Println(args[i])
	}
}

func main(){	
	test()
	fmt.Println("---------------")
    test(3)
	fmt.Println("---------------")
    test(37,58,39,59,47)
}

在这里插入图片描述

【8】基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值。
在这里插入图片描述
在这里插入图片描述

【9】以值传递方式的数据类型,如果希望在函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量。从效果来看类似引用传递。

在这里插入图片描述

【10】在Go中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以对函数调用。

package main
import "fmt"

//定义一个函数:
func test(num int){
	fmt.Println(num)
}

func main(){	
	//函数也是一种数据类型,可以赋值给一个变量
	a := test //变量就是一个函数类型的变量
	fmt.Printf("a的类型是:%T,test函数的类型是:%T \n",a,test)
	//a的类型是:func(int),test函数的类型是:func(int)

	//通过该变量可以对函数调用
	a(10) //等价于test(10)
}

【11】函数既然是一种数据类型,因此在Go中,函数可以作为形参,并且调用(把函数本身当做一种数据类型)

package main
import "fmt"

//定义一个函数:
func test(num int){
	fmt.Println(num)
}

//定义一个函数,把另一个函数作为形参:
func test02 (num1 int ,num2 float32, testFunc func(int)){
	fmt.Println("-----test02")
}

func main(){	
	//函数也是一种数据类型,可以赋值给一个变量
	a := test //变量就是一个函数类型的变量
	fmt.Printf("a的类型是:%T,test函数的类型是:%T \n",a,test)
	//a的类型是:func(int),test函数的类型是:func(int)

	//通过该变量可以对函数调用
	a(10) //等价于test(10)

	//调用test02函数:
	test02(10,3.19,test)
	test02(10,3.19,a)
}

【12】为了简化数据类型定义,Go支持自定义数据类型
基本语法:type 自定义数据类型名 数据类型
可以理解为:相当于起了一个别名
例如:type mylnt int-----》这时mylnt就等价int来使用了.
在这里插入图片描述

例如:type mySum func(int,int) int-----》这时mySum就等价一个函数类型func(int,int) int
在这里插入图片描述

【13】支持对函数返回值命名

传统写法要求:返回值和返回值的类型对应,顺序不能差
在这里插入图片描述

升级写法:对函数返回值命名,里面顺序就无所谓了,顺序不用对应
在这里插入图片描述

包的引入

【1】使用包的原因:
(1)我们不可能把所有的函数放在同一个源文件中,可以分门别类的把函数放在不同的原文件中
在这里插入图片描述

(2)解决同名问题:两个人都想定义一个同名的函数,在同一个文件中是不可以定义相同名字的函数的。此时可以用包来区分

【2】案例展示包:
项目的结构:
在这里插入图片描述
代码展示:
在这里插入图片描述

在这里插入图片描述

包的细节详讲

1.package进行包的声明,建议:包的声明这个包和所在的文件夹同名
在这里插入图片描述

2.main包是程序的入口包,一般main函数会放在这个包下
main函数一定要放在main包下,否则不能编译执行
在这里插入图片描述

3.打包语法:
package 包名

4.引l入包的语法:import “包的路径”
包名是从$GOPATH/src/后开始计算的,使用/进行路径分隔。
在这里插入图片描述
在这里插入图片描述

5.如果有多个包,建议一次性导入,格式如下:
在这里插入图片描述

6.在函数调用的时候前面要定位到所在的包
在这里插入图片描述

7.函数名,变量名首字母大写,函数,变量可以被其它包访问
在这里插入图片描述

8.一个目录下不能有重复的函数
在这里插入图片描述

9.包名和文件夹的名字,可以不一样
在这里插入图片描述
在这里插入图片描述

10.一个目录下的同级文件归属一个包
同级别的源文件的包的声明必须一致
在这里插入图片描述
在这里插入图片描述

11.包到底是什么:
(1)在程序层面,所有使用相同package包名的源文件组成的代码模块
(2)在源文件层面就是一个文件夹

12.可以给包取别名,取别名后,原来的包名就不能使用了
在这里插入图片描述

init函数

【1】init函数:初始化函数,可以用来进行一些初始化的操作
每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用。
在这里插入图片描述

【2】全局变量定义,init函数,main函数的执行流程?
在这里插入图片描述

【3】多个源文件都有init函数的时候,如何执行:
在这里插入图片描述
在这里插入图片描述
执行结果:
在这里插入图片描述
执行过程:
在这里插入图片描述

匿名函数

【1】Go支持匿名函数,如果我们某个函数只是希望使用一次,可以考虑使用匿名函数

【2】匿名函数使用方式:
(1)在定义匿名函数时就直接调用,这种方式匿名函数只能调用一次(用得多)
在这里插入图片描述

(2)将匿名函数赋给一个变量(该变量就是函数变量了),再通过该变量来调用匿名函数(用得少)
在这里插入图片描述

【3】如何让一个匿名函数,可以在整个程序中有效呢?将匿名函数给一个全局变量就可以了

package main
import "fmt"

var Func01 = func (num1 int,num2 int) int{
	return num1 * num2
}

func main(){
	//定义匿名函数:定义的同时调用
    result:=func (num1 int,num2 int) int{
		return num1 + num2
    }(10,20)

	fmt.Println(result)

	//将匿名函数赋给一个变量,这个变量实际就是函数类型的变量
	//sub等价于匿名函数
	sub := func(num1 int,num2 int) int{
		return num1-num2
	}

	//直接调用sub就是调用这个匿名函数了
	result01 := sub(30,70)
	fmt.Println(result01)

	result02 := sub(30,70)
	fmt.Println(result02)

	result03 := Func01(3,7)
	fmt.Println(result03)
}

在这里插入图片描述

闭包

【1】什么是闭包:
闭包就是一个函数和与其相关的引用环境组合的一个整体

【2】案例展示:

package main
import "fmt"

//函数功能:求和
//函数的名字:getSum  参数为空
//getSum函数返回值为一个函数,这个函数的参数是一个int类型的参数,返回值也是int类型
func getSum() func (int) int {
	var sum int = 0
	return func (num int) int{
		sum = sum + num
		return sum
	}
}
//闭包:返回的匿名函数+匿名函数以外的变量num

func main(){
	f := getSum()
	fmt.Println(f(1))//1
	fmt.Println(f(2))//3
	fmt.Println(f(3))//6
	fmt.Println(f(4))//10
}

感受:匿名函数中引用的那个变量会一直保存在内存中,可以一直使用

【3】闭包的本质:
闭包本质依旧是一个匿名函数,只是这个函数引1入外界的变量/参数
匿名函数+引|用的变量/参数=闭包

【4】特点:
(1)返回的是一个匿名函数,但是这个匿名函数引用到函数外的变量/参数,因此这个匿名函数就和变量/参数形成一个整体,构成闭包。
(2)闭包中使用的变量/参数会一直保存在内存中,所以会一直使用—》意味着闭包不可滥用用(对内存消耗大)

【5】不使用闭包可以吗?

package main
import "fmt"

//函数功能:求和
//函数的名字:getSum  参数为空
//getSum函数返回值为一个函数,这个函数的参数是一个int类型的参数,返回值也是int类型
func getSum() func (int) int {
	var sum int = 0
	return func (num int) int{
		sum = sum + num
		return sum
	}
}
//闭包:返回的匿名函数+匿名函数以外的变量num

func main(){
	f := getSum()
	fmt.Println(f(1))//1
	fmt.Println(f(2))//3
	fmt.Println(f(3))//6
	fmt.Println(f(4))//10
	fmt.Println("-----------------")
	fmt.Println(getSum01(0,1))//1
	fmt.Println(getSum01(1,2))//3
	fmt.Println(getSum01(3,3))//6
	fmt.Println(getSum01(6,4))//10
}

func getSum01(sum int,num int) int{
	sum = sum + num
	return sum
}

//不使用闭包的时候:我想保留的值,不可以反复使用
//闭包应用场景:闭包可以保留上次引用的某个值,我们传入一次就可以反复

在这里插入图片描述

defer关键字

【1】defer关键字的作用:
在函数中,程序员经常需要创建资源,为了在函数执行完毕后,及时的释放资源,Go的设计者提供defer关键字

【2】案例展示:
在这里插入图片描述

【3】代码变动一下,再次看结果:

在这里插入图片描述
发现:遇到defer关键字,会将后面的代码语句压入栈中,也会将相关的值同时拷贝入栈中,不会随着函数后面的变化而变化。

【4】defer应用场景:
比如你想关闭某个使用的资源,在使用的时候直接随手defer,因为defer有延迟执行机制(函数执行完毕再执行defer压入栈的语句),所以你用完随手写了关闭,比较省心,省事

系统函数

字符串相关函数

【1】统计字符串的长度,按字节进行统计:
len(str)
使用内置函数也不用导包的,直接用就行
在这里插入图片描述

【2】字符串遍历:

(1)利用方式1:for-range键值循环:
在这里插入图片描述

(2)r:=[]rune(str)
在这里插入图片描述

【3】字符串转整数:
n,err := strconv.Atoi(“666”)
【4】整数转字符串:
str = strconv.ltoa(88)
在这里插入图片描述

【5】查找子串是否在指定的字符串中:
strings.Contains(“javaandgolang”,“go")
在这里插入图片描述

【6】统计一个字符串有几个指定的子串:
strings.Count(“javaandgolang”,“a”)
在这里插入图片描述

【7】不区分大小写的字符串比较:
strings.EqualFold(“go”,“Go”)
在这里插入图片描述

【8】返回子串在字符串第一次出现的索引值,如果没有返回-1:
strings.lndex(“javaandgolang”,“a”)
在这里插入图片描述

【9】字符串的替换:
strings.Replace(“goandjavagogo”,“go",“golang”,n)
n可以指定你希望替换几个,如果n=-1表示全部替换,替换两个n就是2
在这里插入图片描述

【10】按照指定的某个字符,为分割标识,将一个字符串拆分成字符串数组:
strings.Split(“go-python-java”,“-”)
在这里插入图片描述

【11】将字符串的字母进行大小写的转换:
strings.ToLower(Go")// go
strings.ToUpper"go")//Go
在这里插入图片描述

【12】将字符串左右两边的空格去掉:
strings.TrimSpace(“ goandjava ”)
在这里插入图片描述

【13】将字符串左右两边指定的字符去掉:
strings.Trim("~golang ~”,“ ~”)
在这里插入图片描述

【14】将字符串左边指定的字符去掉:
strings.TrimLeft("~golang ~”,“ ~”)
在这里插入图片描述

【15】将字符串右边指定的字符去掉:
strings.TrimRight("~golang ~”,“ ~”)
在这里插入图片描述

【16】判断字符串是否以指定的字符串开头:
strings.HasPrefix(“http://java.sun.com/jsp/jstl/fmt”,“http”)
在这里插入图片描述

【17】判断字符串是否以指定的字符串结束:
strings.HasSuffix("demo.png”,“png”)
在这里插入图片描述

代码案例展示:

package main
import(
	"fmt"
	"strings"
)

func main(){
	//字符串的替换:
	str1 := strings.Replace("goandjavagogo","go","golang",-1)
	str2 := strings.Replace("goandjavagogo","go","golang",2)
	fmt.Println(str1)
	fmt.Println(str2)

	//按照指定的某个字符,为分割标识,将一个学符串拆分成字符串数组:
    arr := strings.Split("go-python-java","-")
	fmt.Println(arr)

	//将字符串的字母进行大小写的转换:
	fmt.Println(strings.ToLower("Go"))
	fmt.Println(strings.ToUpper("go"))

	//将字符串左右两边的空格去掉:
	fmt.Println(strings.TrimSpace("    go and java   "))

	//将字符串左右两边指定的字符去掉:
	fmt.Println(strings.Trim("~golang~","~"))

	//将字符串左边指定的字符去掉: 
    fmt.Println(strings.TrimLeft("~golang~","~"))

	//将字符串右边指定的字符去掉: 
    fmt.Println(strings.TrimRight("~golang~","~"))

	//判断字符串是否以指定的字符串开头:
	fmt.Println(strings.HasPrefix("http://java.sun.com/jsp/jstl/fmt","http"))

	//判断字符串是否以指定的字符串结束:
	fmt.Println(strings.HasSuffix("demo.png","-jpg"))
}

在这里插入图片描述

日期和时间相关函数

【1】时间和日期的函数,需要导入time包,所以你获取当前时间,就要调用函数Now函数:

package main
import (
	"fmt"
	"time"
)

func main(){
	//时间和日期的函数,需要导入time包,所以你获取当前时间,就要调用函数Now函数:
	now := time.Now()
	//Now()返回值是一个结构体,类型是:time.Time
	fmt.Printf("%v~~~对应的类型为:%T\n",now,now)
	//2021-02-0817:47:21.7600788+0800CSTm=+0.005983901~~~对应的类型为:time.Time

	//调用结构体中的方法:
	fmt.Printf("年:%v\n",now.Year())
	fmt.Printf("月:%v\n",now.Month())//月:February
	fmt.Printf("月:%v\n",int(now.Month()))//月:2
	fmt.Printf("日:%v\n",now.Day())
	fmt.Printf("时:%v\n",now.Hour())
	fmt.Printf("分:%v\n",now.Minute())
    fmt.Printf("秒:%v\n",now.Second())
}

【2】日期的格式化:
(1)将日期以年月日时分秒按照格式输出为字符串:

	//Printf将字符串直接输出:
	fmt.Printf("当前年月目:%d-%d-%d 时分秒: %d:%d:%d \n",now.Year(),now.Month(),
	now.Day(),now.Hour(),now.Minute(),now.Second())
	//Sprintf可以得到这个字符串,以便后续使用:
	datestr := fmt.Sprintf("当前年月日:%d-%d-%d 时分秒:%d:%d:%d\n",now.Year(),now.Month(),
	now.Day(),now.Hour(),now.Minute(),now.Second())
	fmt.Println(datestr)

(2)按照指定格式:

    //这个参数字符串的各个数字必须是固定的,必须这样写
	datestr2 := now.Format("2006/01/02 15/04/05")
    fmt.Println(datestr2)
	//选择任意的组合都是可以的,根据需求自己选择就可以(自己任意组合)。
	datestr3 := now.Format("2006 15:04")
	fmt.Println(datestr3)

在这里插入图片描述

内置函数

【1】什么是内置函数/内建函数:
Golang设计者为了编程方便,提供了一些函数,这些函数不用导包可以直接使用,我们称为Go的内置函数/内建函数。

【2】内置函数存放位置:
在builtin包下,使用内置函数也的,直接用就行

【3】常用函数:
(1)len函数:
统计字符串的长度,按字节进行统计
在这里插入图片描述
在这里插入图片描述

(2)new函数:
分配内存,主要用来分配值类型(int系列,float系列,bool,string、数组和结构体struct)
在这里插入图片描述
在这里插入图片描述
内存分析:
在这里插入图片描述

(3)make函数:
分配内存,主要用来分配引I用类型(指针、slice切片、map、管道chan、interface等)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1474481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何多环境切换?如何在微服务配置多环境?

问题本质: nacos配置中心的配置是如何被项目读取到的&#xff1f;(nacos的配置中心和项目是如何联系的&#xff1f;) 注意&#xff1a;nacos有配置管理和服务管理&#xff0c;别弄混。自动注册的是服务管理&#xff01;&#xff01;&#xff01; 1. 如何注册到nacos服务管理中心…

《YOLOv9:从入门到实战》报错解决 专栏答疑

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。《YOLOv9&#xff1a;从入门到实战》专栏上线后&#xff0c;部分同学在学习过程中提出了一些问题&#xff0c;笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容&#xff0c;笔者特意推出了该篇专…

阿里云服务器多少钱?免费的不要钱!

注册阿里云账号&#xff0c;免费领云服务器&#xff0c;最高领取4台云服务器&#xff0c;每月750小时&#xff0c;3个月免费试用时长&#xff0c;可快速搭建网站/小程序&#xff0c;部署开发环境&#xff0c;开发多种企业应用。阿里云服务器网aliyunfuwuqi.com分享阿里云服务器…

【wu-acw-client 使用】案例

wu-acw-client 使用 项目介绍&#xff0c;使用acw-client&#xff0c;创建对应Java项目的增删改查&#xff08;ORM&#xff1a;Lazy ORM、mybatis&#xff09;&#xff0c;项目模块架构&#xff1a;mvc、feign、ddd 演示项目环境&#xff1a;idea 、mac、mysql、jdk17 spring …

【C++进阶】深入了解继承机制

目录 前言 1. 继承的概念 2. 继承的定义 3. 继承中基类与派生类的赋值转换 4. 继承中的作用域 5. 派生类的默认成员函数 6. 继承与友元、静态成员 7. 多继承与菱形继承 7.1 如何解决 前言 继承是面向对象编程中的一个重要概念&#xff0c;也是面向对象编程语言中普遍存在的特…

Python爬虫中的单线程、多线程问题(文末送书)

前言 在使用爬虫爬取数据的时候&#xff0c;当需要爬取的数据量比较大&#xff0c;且急需很快获取到数据的时候&#xff0c;可以考虑将单线程的爬虫写成多线程的爬虫。下面来学习一些它的基础知识和代码编写方法。 一、进程和线程 进程可以理解为是正在运行的程序的实例。进…

实验室储样瓶耐强酸强碱PFA材质试剂瓶适用新材料半导体

PFA&#xff0c;全名可溶性聚四氟乙烯&#xff0c;试剂瓶又叫取样瓶、样品瓶、广口瓶、储样瓶等。主要用于痕量分析、同位素分析等实验室&#xff0c;广泛应用于新兴的半导体、新材料、多晶硅、硅材、微电子等行业。 规格参考&#xff1a;30ml、60ml、100ml、125ml、250ml、30…

QT项目打包

十、项目打包 设置图标 以下是个项目设置图标的 操作步骤 设计或下载一个图标图片&#xff08;推荐分辨率6464及其以上&#xff0c;256256及其以下&#xff09;。转换为.ico格式&#xff0c;转换可以使用下面的网站。 Convertio — 文件转换器 PNG转ICO, 在线转换器 - 转换视频…

国家开放大学 新学期 电大搜题助力学子们取得理想成绩

尊敬的读者朋友们&#xff0c;您是否曾经遇到过在学习中遇到困难&#xff0c;却找不到合适的学习资源和答案的尴尬处境&#xff1f;您是否经历过为了解决学习难题四处奔波而导致时间和精力的浪费&#xff1f;如果您曾经面临这样的困扰&#xff0c;那么您一定不能错过今天为您推…

三、系统知识笔记-计算机系统基础知识

一、计算机系统概述 计算机系统是指用于数据管理的计算机硬件、软件及网络组成的系统。 它是按人的要求接收和存储信息&#xff0c;自动进行数据处理和计算&#xff0c;并输出结果信息的机器系统。 冯诺依曼体系计算机结构&#xff1a; 1.1计算机硬件组成 冯诺依曼计算机结…

中间件-Nginx漏洞整改(限制IP访问隐藏nginx版本信息)

中间件-Nginx漏洞整改&#xff08;限制IP访问&隐藏nginx版本信息&#xff09; 一、限制IP访问1.1 配置Nginx的ACL1.2 重载Nginx配置1.3 验证结果 二、隐藏nginx版本信息2.1 打开Nginx配置文件2.2 隐藏Nginx版本信息2.3 保存并重新加载Nginx配置2.4 验证结果2.5 验证隐藏版本…

LeetCode刷题---查询结果的质量和占比

思路&#xff1a; 首先按照query_name进行分组操作 对组内的rating/position的值求平均值得到quality 对组内的rating的值使用IF函数进行判断&#xff0c;如果rating<3则将其标识为1&#xff0c;如果rating>3,则将其标识为0&#xff0c;通过次方法可以找出组内rating的值…

MNIST数据集下载(自动下载)

&#x1f4da;**MNIST数据集下载(自动下载)**&#x1f4da; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的…

微信小程序的医院体检预约管理系统springboot+uniapp+python

本系统设计的目的是建立一个简化信息管理工作、便于操作的体检导引平台。共有以下四个模块&#xff1a; uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 语言&#xff1a;pythonjavanode.js…

【UE 材质】冰冻效果

效果 步骤 1. 打开“Quixel Bridge” 下载冰的纹理 2. 新建一个材质&#xff0c;这里命名为“M_Frozen” 打开“M_Frozen”&#xff0c;添加如下节点&#xff0c;此时我们可以通过控制参数“偏移”来改变边界的偏移 此时预览效果如下 如果增加参数“偏移”的默认值效果如下 3.…

在 Android 运行 GNU/Linux 二进制程序 (proot)

在 GNU/Linux 系统上运行 Android 应用比较容易 (比如 waydroid), 但是反过来就很麻烦了. Android 虽然也使用 Linux 内核 (kernel), 但是系统环境和一般的 GNU/Linux 系统 (比如 ArchLinux, Debian, Ubuntu, Fedora, NixOS 等) 具有不可忽略的显著差异, 所以为 GNU/Linux 编译…

泽攸科技JS系列高精度台阶仪在半导体领域的应用

泽攸科技JS系列高精度台阶仪是一款先进的自主研发的国产台阶仪&#xff0c;采用了先进的扫描探针技术。通过扫描探针在样品表面上进行微观测量&#xff0c;台阶仪能够准确获取表面形貌信息。其工作原理基于探针与样品表面的相互作用力&#xff0c;通过测量探针的微小位移&#…

[论文笔记] Mistral论文解读

https://arxiv.org/pdf/2310.06825.pdf GQA: 1、加快推理速度 2、减小内存需求 3、允许更大的batch 4、更高的吞吐量 SWA&#xff1a; 1、较低的计算成本 更有效的处理 较长的序列。 2、感受野更符合常理。不再是全局感受野&#xff0c;而是只和前4096个进行语义融合。…

AI入门系列——数据分析(待续)

我们首先要对人工智能领域有个宽泛的了解&#xff0c;有自己的全局性的认识&#xff0c;产生一些判断&#xff0c;才不会人云亦云地因为“薪资高、压力大”等去做出选择或者放弃。再者你做的准备调研越多&#xff0c;确认方向后越不容易放弃&#xff08;等门槛效应&#xff09;…

智能手表的革命性突破:TRIZ理论引领未来穿戴技术!

在科技日新月异的今天&#xff0c;智能手表已经从单纯的计时工具转变为集健康监测、信息通讯、娱乐休闲等多功能于一体的智能穿戴设备。而基于TRIZ理论的智能手表更是在这一变革中扮演着引领者的角色。TRIZ&#xff0c;即发明问题解决理论&#xff0c;是一套系统的创新方法学&a…