go语言基础入门(一)

  • 变量声明:
  • 批量声明变量:
  • 变量赋值:
    • 声明变量同时为变量赋值
    • 可以在变量声明时为其赋值
    • go中赋值时的编译器会自动根据等号右侧的数据类型自动推导变量的类型
    • 使用 := 进行赋值
    • 匿名变量
  • 常量
  • 常量计数器iota
  • 1. 使用场景
  • 2. 基本用法
  • 3. 简化语法
  • 4. 自定义增量
  • 5. 复杂使用
  • go的类似枚举
    • 使用 const 和 iota 定义枚举
  • 使用 map 实现枚举
  • 附加
  • Galang(二) 基本数据类型
  • 字符串
    • 字符串转义符
    • 多行字符串
    • 常用字符串操作
  • byte 和 rune 类型
    • 修改字符串
  • 类型转换
    • 基本语法
  • 流程控制
  • 1. 条件语句
  • if 语句
  • switch 语句
  • 2. 循环语句
  • 基本的 for 循环
  • for 循环与条件
  • 无限循环
  • for range 循环 用于遍历数组、切片、字符串、映射(map)等数据结构。
  • 3. 跳转语句
  • break 语句
  • continue 语句
  • goto 语句

变量声明:

变量的声明以 var 关键字开头,后面是变量名,最后是变量的类型,在java中一般使用分号结尾,go则写不写都行,一般不写

var 变量名 变量的类型
var id int
var name string

批量声明变量:

使用 var( )  括号中 写 变量名 变量的类型
var (
	变量名 变量的类型
	变量名 变量的类型
	变量名 变量的类型
)
var (
	id int
	name string
)

变量赋值:

go中的变量在声明时会自动初始化,与数字相关的变量默认为 0 ,字符串默认为 “” ,布尔值默认是 false ;切片,函数和指针默认是 nil (nil是go中的空)

声明变量同时为变量赋值

var 变量名 类型 =
var id int = 1
var name string = "张三"

可以在变量声明时为其赋值

//多个变量以逗号分隔,等号后的值按照先后顺序赋值
var id ,name = 1 , "张三"

var (
	id int = 1
	name string = "张三"
)

go中赋值时的编译器会自动根据等号右侧的数据类型自动推导变量的类型

//可以省略变量类型
var (
	id  = 1
	name = "张三"
)

使用 := 进行赋值

还可以使用简写 := 方式声明变量并初始化  这种方法只能在函数内部使用

:=是一个简短声明符(short variable declaration operator),用于在声明变量时简化语法。它允许程序员在声明变量的同时进行初始化。

使用:=声明的变量的作用域是局部的,也就是说,在函数内部使用:=声明的变量只能在该函数内部访问。如果在函数外部使用该符号,会导致编译错误。

:=只能用于声明新变量。如果变量已经被声明,就不能再使用:=方式来赋值,必须使用=运算符。

可以在同一行中使用:=来同时声明多个变量

func main() {
	id := 10
	name := 200 
	fmt.Println(m, n)//将id name在控制台输出
}

匿名变量

匿名变量使用 下划线  _  来表示 ,作用是可以忽略某个值, 

可以用来占位 ,此变量不占用命名空间,同时也不会为其分配内存

//t1 函数返回两个int 类型的值
func t1() (int, int) {
	return 1, 2
}
func main() {
	i, _ := t1()//函数返回的 2 被忽略
	_, j := t1()//函数返回的 1 被忽略
	fmt.Println(i, j) //输出 1,2
}for循环中使用
在迭代的过程中,如果只关心索引或值中的一个部分,可以使用匿名变量。这使得代码更加简洁。

示例:
package main

import "fmt"

func main() {
    pairs := []struct {
        x, y int
    }{
        {1, 2},
        {3, 4},
        {5, 6},
    }

    for _, v := range pairs {
        fmt.Println(v.x) // 只使用x,忽略y
    }
}

常量

常量是程序中不可改变的值。常量在声明后不能被重新赋值。

使用const关键字声明常量:

const Pi = 3.14

类型推断:常量可以在声明时指定类型,也可以省略,编译器会根据值自动推断。

const (
e = 2.71828   // 无类型常量
c int = 299792458  // 指定类型常量
)

作用域:

常量的作用域和变量相似,可以是局部的或包级别的。
示例:


package main

import "fmt"

const Pi = 3.14  // 声明常量

func main() {
fmt.Println("Pi:", Pi)
// Pi = 3.14159  // 这将导致编译错误,因为常量不能被修改
}
| 特性           | 变量                     | 常量                      |
|----------------|--------------------------|---------------------------|
| 可变性         | 可以被修改               | 不可被修改                |
| 声明关键字     | var 或简短声明符 :=      | const                     |
| 声明时类型     | 可选                     | 可选                      |
| 内存使用       | 占用内存                 | 编译时确定,无需占用运行时内存 |
| 作用域         | 局部或包级别             | 局部或包级别              |

常量计数器iota

在Go语言中,iota是一个预定义的标识符,用于简化常量的创建,尤其是在需要一系列相关常量时。

iota的值在每个常量声明块中自动递增,从0开始。

1. 使用场景

iota通常用于定义一组具有相关性的常量,例如枚举值、位掩码等。

2. 基本用法

在一个常量声明中,每个常量的iota值会从0开始,并在每行中自动递增1。

package main

import "fmt"

const (
    A = iota // 0
    B = iota // 1
    C = iota // 2
)

func main() {
    fmt.Println(A, B, C) // 输出: 0 1 2
}

3. 简化语法

在同一个常量声明块中,可以省略iota,它仍然会正确递增。

package main

import "fmt"

const (
    X = iota // 0
    Y        // 1,自动从上一个常量继承iota值
    Z        // 2
)

func main() {
    fmt.Println(X, Y, Z) // 输出: 0 1 2
}

4. 自定义增量

可以在常量声明中使用算术运算与iota结合,创建具有特定增量的常量。例如,如果希望常量的值是2的倍数,可以这样做:

package main

import "fmt"

const (
    _ = iota // 忽略第一个值(0)
    Two = iota * 2 // 2
    Four = iota * 2 // 4
    Six = iota * 2 // 6
)

func main() {
    fmt.Println(Two, Four, Six) // 输出: 2 4 6
}

5. 复杂使用

iota还可以与位移、位运算等结合使用,在需要创建位掩码时非常方便。

package main

import "fmt"

const (
    Flag1 = 1 << iota // 1 << 0,值为1
    Flag2             // 1 << 1,值为2
    Flag3             // 1 << 2,值为4
    Flag4             // 1 << 3,值为8
)

func main() {
    fmt.Println(Flag1, Flag2, Flag3, Flag4) // 输出: 1 2 4 8
}

go的类似枚举

在 Go 1.13 及更高版本中,虽然没有引入传统意义上的枚举类型,但可以通过使用 const 和 iota 来实现类似的功能,
并且可以通过 string 类型的方法来增强枚举的可读性和可维护性。

使用 const 和 iota 定义枚举

在这个例子中,我们定义了一个 Weekday 类型,并使用 iota 来生成枚举值。

然后,我们为 Weekday 类型实现了 String 方法,这样在打印枚举值时,会输出对应的字符串名称,而不是整数值。
package main

import "fmt"

type Weekday int

const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)

func (w Weekday) String() string {
    return [...]string{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}[w]
}

func main() {
    fmt.Println(Sunday)    // 输出: Sunday
    fmt.Println(Monday)    // 输出: Monday
    fmt.Println(Tuesday)   // 输出: Tuesday
    fmt.Println(Wednesday) // 输出: Wednesday
    fmt.Println(Thursday)  // 输出: Thursday
    fmt.Println(Friday)    // 输出: Friday
    fmt.Println(Saturday)  // 输出: Saturday
}

使用 map 实现枚举

另一种方法是使用 map 来实现枚举,这样可以更灵活地处理枚举值和名称之间的映射。

package main

import "fmt"

type Weekday int

const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
)

var weekdayNames = map[Weekday]string{
    Sunday:    "Sunday",
    Monday:    "Monday",
    Tuesday:   "Tuesday",
    Wednesday: "Wednesday",
    Thursday:  "Thursday",
    Friday:    "Friday",
    Saturday:  "Saturday",
}

func (w Weekday) String() string {
    return weekdayNames[w]
}

func main() {
    fmt.Println(Sunday)    // 输出: Sunday
    fmt.Println(Monday)    // 输出: Monday
    fmt.Println(Tuesday)   // 输出: Tuesday
    fmt.Println(Wednesday) // 输出: Wednesday
    fmt.Println(Thursday)  // 输出: Thursday
    fmt.Println(Friday)    // 输出: Friday
    fmt.Println(Saturday)  // 输出: Saturday
}

附加

2. 布尔类型
类型:bool
常量:true和false,分别为0 == 00 != 0的值。
3. 整数类型
无符号整数:

uint8:范围0255。
uint16:范围065535。
uint32:范围04294967295。
uint64:范围018446744073709551615。
带符号整数:

int8:范围-128127。
int16:范围-3276832767。
int32:范围-21474836482147483647。
int64:范围-92233720368547758089223372036854775807int:至少32位的带符号整数,不是int32的别名。
uint:至少32位的无符号整数,不是uint32的别名。
4. 浮点数和复数类型
浮点数:
float32和float64分别为IEEE 754格式的32位和64位浮点数。
复数:
complex64和complex128分别为具有float32和float64实部和虚部的复数。
5. 字符串和字节
类型:
string:表示8位字节字符串,通常表示UTF-8编码文本。
byte:是uint8的别名,通常用于表示字节值。
rune:是int32的别名,用于表示字符值。
6. 预声明标识符
nil:表示指针、通道、函数、接口、映射或切片类型的零值。
iota:表示当前常量声明中的未类型化整数序号,从0开始递增。
any:是interface{}的别名,表示可以接受任何类型的空接口。
comparable:一个接口,所有可比较类型(布尔、数字、字符串等)都实现该接口,但它只能作为类型参数的约束,而不能作为变量的类型。
7. 内置函数
基本操作:

    append:将元素追加到切片末尾。
    copy:从源切片复制元素到目标切片。
    delete:从映射中删除指定键的元素。
    len:返回值的长度。
    cap:返回切片或通道的容量。
内存管理:
    
    make:用于分配和初始化切片、映射或通道。
    new:分配内存并返回指向新分配零值的指针。
数学操作:
    
    max:返回一组值中的最大值。
    min:返回一组值中的最小值。
    complex、real、imag:用于复数的创建和获取实部、虚部。
通道操作:

    close:关闭通道。
    clear:清空映射和切片。
错误处理:
    
    panic:停止当前goroutine的正常执行。
    recover:恢复正在恐慌的goroutine的正常执行。
打印输出:

    print和println:将数据格式化并写入标准错误。
8. 错误接口
    error:表示错误条件的常规接口,nil值表示没有错误。

Galang(二) 基本数据类型

字符串

Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样。 Go 语言里的字符串的内部实现使用UTF-8
编码。 字符串的值为双引号(")
中的内容,可以在Go语言的源码中直接添加非ASCII码字符

s1 := "hello Word"

字符串转义符

\r回车符(返回行首)
\n换行符(直接跳到下一行的同列位置)
\t制表符
\’单引号
\”双引号
\反斜杠

多行字符串

Go语言中要定义一个多行字符串时,就必须使用反引号字符

s1 := `第一行
第二行
第三行
`
fmt.Println(s1)

常用字符串操作

方法作用
len(str)求长度
+或fmt.Sprintf拼接字符型
strings.Split分割
strings.contains判断是否包含
strings.HasPrefix strings.HasSuffix前缀 后缀判断
strings.Index() strings.LastIndex()子串出现的位置
strings.Join(a[]string, sep string)join操作
package main

import (
	"fmt"
	"strings"
)

func main() {
	// 定义字符串
	str := "Hello, World! Welcome to Go programming."

	// 1. 求长度
	length := len(str)
	fmt.Println("字符串长度:", length)

	// 2. 拼接字符型
	str2 := " Enjoy learning!"
	concatenated := str + str2
	fmt.Println("拼接后的字符串:", concatenated)

	// 3. 分割
	// 注意:分割后的部分是字符串数组,不是切片
	parts := strings.Split(str, " ")
	fmt.Println("分割后的部分:", parts[0], parts[1], parts[2])

	// 4. 判断是否包含
	containsHello := strings.Contains(str, "Hello")
	fmt.Println("包含 'Hello'?", containsHello)

	// 5. 前缀和后缀判断
	hasPrefix := strings.HasPrefix(str, "Hello")
	hasSuffix := strings.HasSuffix(str, "programming.")
	fmt.Println("以 'Hello' 开头?", hasPrefix)
	fmt.Println("以 'programming.' 结尾?", hasSuffix)

	// 6. 子串出现的位置
	index := strings.Index(str, "World")
	lastIndex := strings.LastIndex(str, "o")
	fmt.Println("'World' 出现的位置:", index)
	fmt.Println("'o' 最后出现的位置:", lastIndex)

	// 7. join操作
	words := []string{"Go", "is", "great!"}
	joined := strings.Join(words, " ")
	fmt.Println("连接后的字符串:", joined)

	// 8. 替换
	replaced := strings.Replace(str, "World", "Gopher", 1)
	fmt.Println("替换后的字符串:", replaced)

	// 9. 大小写转换
	upper := strings.ToUpper(str)
	lower := strings.ToLower(str)
	fmt.Println("全大写:", upper)
	fmt.Println("全小写:", lower)

	// 10. 去掉空白
	strWithSpaces := "   Hello, World!   "
	trimmed := strings.TrimSpace(strWithSpaces)
	fmt.Println("去掉空白后的字符串:", trimmed)

	// 11. 判断是否为空
	if str == "" {
		fmt.Println("字符串是空的")
	} else {
		fmt.Println("字符串不是空的")
	}

	// 12. 格式化字符串
	name := "Go"
	version := 1.18
	formatted := fmt.Sprintf("%s programming language version %.2f", name, version)
	fmt.Println("格式化字符串:", formatted)

	// 13. 多个替换
	replacer := strings.NewReplacer("Hello", "Hi", "World", "Gopher")
	newStr := replacer.Replace(str)
	fmt.Println("多个替换后的字符串:", newStr)

}

byte 和 rune 类型

组成每个字符串的元素叫做“字符”,可以通过遍历或者单个获取字符串元素获得字符。
字符用单引号(’)包裹起来

byte 适合用于处理ASCII字符及二进制数据,常用于文件和网络数据的操作。
rune 更适合处理包含Unicode字符的字符串,能够处理各种语言的字符,是进行国际化开发时不可或缺的类型。

var a = '中'
var b = 'x'
Go 语言的字符有以下两种
  1. uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。

  2. rune类型,代表一个UTF-8字符

    当需要处理中文、日文或者其他复合字符时,则需要用到rune类型。rune类型实际是一个int32

// 遍历字符串
func traversalString() {
	s := "hello世界"
	for i := 0; i < len(s); i++ { //byte
		fmt.Printf("%v(%c) ", s[i], s[i])
	}
	fmt.Println()
	for _, r := range s { //rune
		fmt.Printf("%v(%c) ", r, r)
	}
	fmt.Println()
}

输出:

104(h) 101(e) 108(l) 108(l) 111(o) 230(æ) 178(²) 153() 230(æ) 178(²) 179(³) 
104(h) 101(e) 108(l) 108(l) 111(o) 19990() 30028()

因为UTF8编码下一个中文汉字由3~4个字节组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面输出中第一行的结果

字符串底层是一个byte数组,所以可以和[]byte
类型相互转换。字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。 rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成

修改字符串

要修改字符串,需要先将其转换成[]rune[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组

package main

import (
    "fmt"
)

func main() {
    // 使用 byte 处理 ASCII 字符
    var b byte = 'A'
    fmt.Println("byte 类型:", b)

    // 使用 rune 处理 Unicode 字符
    var r rune = '汉'
    fmt.Println("rune 类型:", r)

    // 字符串中的字节和字符数
    str := "Hello, 世界!"
    fmt.Println("字符串的字节数:", len(str))

    // 使用 range 遍历字符串中的字符
    fmt.Println("字符和对应的 rune值:")
    for i, c := range str {
        fmt.Printf("索引 %d: 字符 %c, rune 值 %d\n", i, c, c)
    }
}

类型转换

在 Go 语言中,类型转换是将一个数据类型的值转换为另一个数据类型的过程。Go 语言提供了安全和明确的类型转换机制,以确保类型的一致性。

基本语法

类型转换的基本语法如下:

newType(expression) 其中 newType 是目标类型,expression 是要转换的值。

基本数值类型的转换

package main

import "fmt"

func main() {
    var a int = 10
    var b float64 = float64(a) // int 转换为 float64
    fmt.Println("int:", a)
    fmt.Println("float64:", b)

    var c float64 = 3.14
    var d int = int(c) // float64 转换为 int(会丢失小数部分)
    fmt.Println("float64:", c)
    fmt.Println("int:", d)
}

字符与整数的转换

package main

import "fmt"

func main() {
    var r rune = 'A'      // 字符 'A'
    var b byte = byte(r)  // rune 转换为 byte
    var ascii int = int(b) // byte 转换为 int
    
    fmt.Printf("rune: %c, byte: %d, ascii: %d\n", r, b, ascii) // 输出: rune: A, byte: 65, ascii: 65
}

字符串与字节切片的转换

package main

import "fmt"

func main() {
    str := "Hello, Go!"
    
    // 字符串转换为字节切片
    byteSlice := []byte(str)
    fmt.Println("Byte Slice:", byteSlice)

    // 字节切片转换为字符串
    newStr := string(byteSlice)
    fmt.Println("String:", newStr)
}
接口转换 Go 语言中的类型转换也包括接口类型的转换。可以将实现了某个接口的类型转换为该接口。

package main

import "fmt"

type Animal interface {
    Speak() string
}

type Dog struct{}

func (d Dog) Speak() string {
    return "Woof!"
}

func main() {
    var a Animal // 接口类型
    a = Dog{}    // 赋值实现了 Animal 接口的 Dog 类型

    // 类型断言
    if dog, ok := a.(Dog); ok {
        fmt.Println("它是狗,叫声:", dog.Speak())
    }
}

流程控制

1. 条件语句

Go 中的条件语句主要有 if 和 switch。

if 语句

用来根据条件执行特定的代码块。

package main

import (
    "fmt"
)

func main() {
    age := 18

    if age < 18 {
        fmt.Println("未成年人")
    } else if age >= 18 && age < 65 {
        fmt.Println("成年人")
    } else {
        fmt.Println("老年人")
    }
}

switch 语句

用于多条件判断,它比多个 if 语句更简洁。

package main

import (
    "fmt"
)

func main() {
    day := 3

    switch day {
    case 1:
        fmt.Println("星期一")
    case 2:
        fmt.Println("星期二")
    case 3:
        fmt.Println("星期三")
    default:
        fmt.Println("其他天")
    }
}

一个分支可以有多个值,多个case值中间使用英文逗号分隔。

func testSwitch3() {
	switch n := 7; n {
	case 1, 3, 5, 7, 9:
		fmt.Println("奇数")
	case 2, 4, 6, 8:
		fmt.Println("偶数")
	default:
		fmt.Println(n)
	}
}

分支还可以使用表达式,这时候switch语句后面不需要再跟判断变量

func switchDemo4() {
	age := 30
	switch {
	case age < 25:
		fmt.Println("好好学习吧")
	case age > 25 && age < 35:
		fmt.Println("好好工作吧")
	case age > 60:
		fmt.Println("好好享受吧")
	default:
		fmt.Println("活着真好")
	}
}

fallthrough语法可以执行满足条件的case的下一个case,是为了兼容C语言中的case设计的

func switchDemo5() {
	s := "a"
	switch {
	case s == "a":
		fmt.Println("a")
		fallthrough
	case s == "b":
		fmt.Println("b")
	case s == "c":
		fmt.Println("c")
	default:
		fmt.Println("...")
	}
}

输出: a b

2. 循环语句

Go 语言中提供了 for 循环来实现循环,使用非常灵活。

基本的 for 循环

package main

import (
    "fmt"
)

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println("计数:", i)
    }
}

for 循环与条件

也可以使用 for 循环形式的条件判断。

package main

import (
    "fmt"
)

func main() {
    i := 0
    for i < 5 {
        fmt.Println("计数:", i)
        i++
    }
}

无限循环

使用 for 后不加条件,即可形成无限循环。

循环可以通过break、goto、return、panic语句强制退出循环。

package main

import (
    "fmt"
)

func main() {
    i := 0
    for {
        if i >= 5 {
            break // 使用 break 退出循环
        }
        fmt.Println("计数:", i)
        i++
    }
}

for range 循环 用于遍历数组、切片、字符串、映射(map)等数据结构。

基本语法

for range 的基本语法如下:

for index, value := range collection {
    // 使用 index 和 value
}
index 是当前元素的索引(对于数组、切片和字符串)。
value 是当前元素的值。
collection 是需要遍历的集合,可以是数组、切片、字符串或映射等。
遍历切片
package main

import (
    "fmt"
)

func main() {
    names := []string{"Alice", "Bob", "Charlie"}

    for index, name := range names {
        fmt.Printf("索引: %d, 名称: %s\n", index, name)
    }
}
遍历数组
package main

import (
    "fmt"
)

func main() {
    numbers := [5]int{1, 2, 3, 4, 5}

    for index, number := range numbers {
        fmt.Printf("索引: %d, 数字: %d\n", index, number)
    }
}
遍历字符串 for range 还能用来遍历字符串,每次迭代返回一个字符和它的 Unicode 码点。
package main

import (
    "fmt"
)

func main() {
    str := "你好, 世界!"

    for index, char := range str {
        fmt.Printf("索引: %d, 字符: %c\n", index, char)
    }
}
遍历映射 (map)
package main

import (
    "fmt"
)

func main() {
    ages := map[string]int{
        "Alice": 25,
        "Bob":   30,
        "Charlie": 35,
    }

    for name, age := range ages {
        fmt.Printf("%s 的年龄是: %d\n", name, age)
    }
}

3. 跳转语句

Go 中的跳转语句包括 break、continue 和 goto。

break 语句

用于跳出循环或 switch 语句。

package main

import (
    "fmt"
)

func main() {
    for i := 0; i < 10; i++ {
        if i == 5 {
            break // 当 i 等于 5 时跳出循环
        }
        fmt.Println("计数:", i)
    }
}

continue 语句

用于跳过当前循环的剩余部分,进入下一次循环。

package main

import (
    "fmt"
)

func main() {
    for i := 0; i < 10; i++ {
        if i%2 == 0 {
            continue // 跳过偶数
        }
        fmt.Println("奇数:", i)
    }
}

goto 语句

允许程序跳转到指定标签。使用要谨慎,因为可能会导致代码可读性降低。

package main

import (
    "fmt"
)

func main() {
    i := 0
CountLoop:
    fmt.Println("计数:", i)
    i++
    if i < 5 {
        goto CountLoop // 跳转到 CountLoop 标签
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

craco-less使用问题

craco-less使用问题 问题背景 前端是用React搭建&#xff0c;使用craco配置&#xff0c;相关库或插件版本如下 "craco/craco": "^7.1.0","react-scripts": "^5.0.1","craco-less": "^3.0.1"在生产环境&#xff…

P9235 [蓝桥杯 2023 省 A] 网络稳定性

*原题链接* 最小瓶颈生成树题&#xff0c;和货车运输完全一样。 先简化题意&#xff0c; 次询问&#xff0c;每次给出 &#xff0c;问 到 的所有路径集合中&#xff0c;最小边权的最大值。 对于这种题可以用kruskal生成树来做&#xff0c;也可以用倍增来写&#xff0c;但不…

国内可以使用的ChatGPT服务【9月持续更新】

首先基础知识还是要介绍得~ 一、模型知识&#xff1a; GPT-4o&#xff1a;最新的版本模型&#xff0c;支持视觉等多模态&#xff0c;OpenAI 文档中已经更新了 GPT-4o 的介绍&#xff1a;128k 上下文&#xff0c;训练截止 2023 年 10 月&#xff08;作为对比&#xff0c;GPT-4…

SSM+vue音乐播放器管理系统

音乐播放器管理系统 随着社会的发展&#xff0c;计算机的优势和普及使得音乐播放器管理系统的开发成为必需。音乐播放器管理系统主要是借助计算机&#xff0c;通过对首页、音乐推荐、付费音乐、论坛信息、个人中心、后台管理等信息进行管理。减少管理员的工作&#xff0c;同时…

2024短剧系统开发,付费短剧小程序app源码教程,分销功能讲解搭建上线

短剧系统技术栈 前端&#xff1a;vue3uniapp 后端&#xff1a; php 数据库&#xff1a;mysql 服务器环境&#xff1a; centos7.6 宝塔 php7.4 MySQL5.7 一、短剧系统功能 短剧用户端&#xff1a; 小程序、抖音小程序、快手小程序、APP、 z付宝小程序 系统用户端详细功能&…

有关shell指令练习2

写一个shell脚本&#xff0c;将以下内容放到脚本中 在家目录下创建目录文件&#xff0c;dir dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中&#xff0c; 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把dir2.tar.xz移动到dir1中 …

ABAP-Swagger 一种公开 ABAP REST 服务的方法

ABAP-Swagger An approach to expose ABAP REST services 一种公开 ABAP REST 服务的方法 Usage 1: develop a class in ABAP with public methods 2: implement interface ZIF_SWAG_HANDLER, and register the public methods(example method zif_swag_handler~meta) 3: …

nonlocal本质讲解(前篇)——从滤波到Nonlocal均值滤波

线性滤波 → \rightarrow →高斯滤波 → \rightarrow →高斯滤波 → \rightarrow →双边滤波 → \rightarrow →Nonlocal均值滤波 平均 高斯 双边 Nonlocal 目录 线性滤波高斯滤波双边滤波Nonlocal均值滤波 滤波最初是频域的概念&#xff0c;由于频域乘积对应空域卷积&am…

药物分子生成算法综述:从生成对抗网络到变换器模型的多样化选择

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 基于已有的药物数据生成新的药物分子是一项复杂的任务&#xff0c;通常涉及到生成模型和机器学习算法。以下是一些常用的算法和方法&#xff1a; 1. 生成对抗网络 (GANs) 特点: 由生成…

罗马数字详解

一. 罗马数字の背景 1. 罗马数字的诞生与进化 罗马数字起源于古罗马帝国&#xff0c;拥有一个漫长而复杂的历史&#xff0c;始于公元前 8 世纪至 9 世纪&#xff0c;与古罗马帝国在帕兰丁山&#xff08;Palantine Hill&#xff09;周围建立的时间大致相同。不过&#xff0c;罗…

【GUI设计】基于Matlab的图像处理GUI系统(2),matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于Matlab的图像处理GUI系统&#xff08;2&#xff09;&#xff0c;用matlab实现。…

jboss

一。CVE-2015-7501 1.POC&#xff0c;访问地址 192.168.10.193:8080/invoker/JMXInvokerServlet 返回如下&#xff0c;说明接⼝开放&#xff0c;此接⼝存在反序列化漏洞 2.下载 ysoserial ⼯具进⾏漏洞利⽤ https://github.com/frohoff/ysoserial 将反弹shell进⾏base64编码…

java重点学习-设计模式

十三 设计模式 工厂模式&#xff1a;spring中使用&#xff08;目的是&#xff1a;解耦&#xff09; 1.简单工厂 所有的产品都共有一个工厂&#xff0c;如果新增产品&#xff0c;则需要修改代码&#xff0c;违反开闭原则是一种编程习惯&#xff0c;可以借鉴这种编程思路 2.工厂方…

基于SpringBoot+WebSocket实现地图上绘制车辆实时运动轨迹图

实现基于北斗卫星的车辆定位和轨迹图的Maven工程&#xff08;使用模拟数据&#xff09;&#xff0c;我们将使用以下技术&#xff1a; Spring Boot&#xff1a;作为后端框架&#xff0c;用来提供数据接口。Thymeleaf&#xff1a;作为前端模板引擎&#xff0c;呈现网页。Leaflet…

Java律师法律咨询小程序

技术&#xff1a;Java、Springboot、mybatis、Vue、Mysql、微信小程序 1.代码干净整洁&#xff0c;可以快速二次开发和添加新功能 2.亮点可以添加AI法律咨询作为 创新点 系统分&#xff1a;用户小程序端&#xff0c;律师web端和管理员端 用户可以在小程序端登录系统进入首…

c++249多态

#include<iostream> using namespace std; class Parent { public:Parent(int a){this->a a;cout << " Parent" << a << endl;} public:virtual void print()//在子类里面可写可不写 {cout << "Parent" <<a<&l…

机器翻译之Bahdanau注意力机制在Seq2Seq中的应用

目录 1.创建 添加了Bahdanau的decoder 2. 训练 3.定义评估函数BLEU 4.预测 5.知识点个人理解 1.创建 添加了Bahdanau的decoder import torch from torch import nn import dltools#定义注意力解码器基类 class AttentionDecoder(dltools.Decoder): #继承dltools.Decoder写…

大数据实验2.Hadoop 集群搭建(单机/伪分布式/分布式)

实验二&#xff1a; Hadoop安装和使用 一、实验目的 实现hadoop的环境搭建和安装Hadoop的简单使用&#xff1b; 二、实验平台 操作系统&#xff1a;Linux&#xff08;建议Ubuntu16.04或者18.04&#xff09;&#xff1b;Hadoop版本&#xff1a;3.1.3&#xff1b;JDK版本&…

安全热点问题

安全热点问题 1.DDOS2.补丁管理3.堡垒机管理4.加密机管理 1.DDOS 分布式拒绝服务攻击&#xff0c;是指黑客通过控制由多个肉鸡或服务器组成的僵尸网络&#xff0c;向目标发送大量看似合法的请求&#xff0c;从而占用大量网络资源使网络瘫痪&#xff0c;阻止用户对网络资源的正…

【靶点Talk】免疫检查点争夺战:TIGIT能否超越PD-1?

曾经的TIGIT靶点顶着“下一个PD-1”的名号横空出世&#xff0c;三年的“征程”中TIGIT走过一次又一次的失败&#xff0c;然而面对质疑和压力仍有一批公司选择前行。今天给大家分享TIGIT靶点的相关内容&#xff0c;更多靶点科普视频请关注义翘神州B站和知乎官方账号。 TIGIT的“…