第三十一:golang 声明切片讲解
·
一: 切片合并
注意: 基于go 实现 php 部份函数:
github.com/Echo-Mr-Pengw/go-to-php/str
golang中使用gorm写入time.Time的类型时间问题
https://cloud.tencent.com/developer/article/2401442
定义一个切片类型的结构体:
// 定义一个切征模型
type MyModel struct {
gorm.Model
Asset []string `gorm:"type:json"` // 假设这是一个字符串数组
MedicalStrategyParams []string `gorm:"type:json"` // 假设这也是一个字符串数组
}
[golang]字符串拼接
https://developer.aliyun.com/article/1579386
golang项目中如何实现级联查询
https://blog.csdn.net/weixin_51261234/article/details/129014674
package main
import (
"fmt"
)
func main() {
// 定义三个不同类型的切片
slice1 := []int{1, 2, 3}
slice2 := []string{"a", "b", "c"}
slice3 := []float64{1.1, 2.2, 3.3}
// 使用空接口创建一个新的切片,用于存储所有类型的元素
var mergedSlice []interface{}
// 将第一个切片的元素添加到mergedSlice中
for _, v := range slice1 {
mergedSlice = append(mergedSlice, v)
}
// 将第二个切片的元素添加到mergedSlice中
for _, v := range slice2 {
mergedSlice = append(mergedSlice, v)
}
// 将第三个切片的元素添加到mergedSlice中
for _, v := range slice3 {
mergedSlice = append(mergedSlice, v)
}
// 打印合并后的切片
fmt.Println(mergedSlice)
}
// 第二种处理模式:
// 使用空接口创建一个新的切片,用于存储所有类型的元素
var mergedSlice []interface{}
// 访问特定类型的元素
for _, v := range mergedSlice {
switch val := v.(type) {
case int:
fmt.Println("int:", val)
case string:
fmt.Println("string:", val)
case float64:
fmt.Println("float64:", val)
default:
fmt.Println("unknown type")
}
}
type MixedType struct {
Value interface{} // 存储任何类型的值
Type string // 存储值的类型名称,便于后续处理和类型断言
}
二:切片声明处理
var mySlice1 []int = []int{1, 2, 3}
fmt.Println(mySlice1) // 输出: [1 2 3]
// 使用make函数创建切片并初始化
mySlice2 := make([]int, 3) // 长度为3,初始化为0值
fmt.Println(mySlice2) // 输出: [0 0 0]
// 使用append添加元素到切片中
mySlice2 = append(mySlice2, 6, 5) // 现在长度为5,包含[0,0,0,6,5]
fmt.Println(mySlice2) // 输出: [0 0 0 4 5]
s1 := make([]int, 0, 5)
fmt.Println("最后输出s1的结果是:", s1)
三:切片元素是否存在一个切片中
import (
"strconv"
)
func InSlice(value interface{}, list []string) bool {
switch value.(type) {
case int:
value = strconv.Itoa(value.(int)) // value.(int)表示断言:value是一个int
case uint:
value = strconv.Itoa(int(value.(uint))) // int(type)表示强类型转换:将uint转为int
case float64:
value = strconv.FormatFloat(value.(float64), 'f', -1, 64) // 将float64转为string
case float32:
value = strconv.FormatFloat(float64(value.(float32)), 'f', -1, 32) // 将float32先转为float64再转为string
}
for _, el := range list {
if el == value {
return true
}
}
return false
}
// 也可以使用 切片转换成 map ,再进行查找
// 开始部份
package main
import (
"fmt"
)
type Person struct {
ID string
Name string
}
func main() {
people := []Person{
{"1", "Alice"},
{"2", "Bob"},
{"3", "Charlie"},
}
// 使用map的键类型和值类型与Person的ID和Name相匹配
peopleMap := make(map[string]string)
for _, person := range people {
peopleMap[person.ID] = person.Name
}
fmt.Println(peopleMap) // 输出: map[1:Alice 2:Bob 3:Charlie]
}
value, ok := myMap[key]
if !ok {
// 键不存在
} else {
// 键存在,value是对应的值
}
// 第二种方法:
if value, exists := myMap[key]; exists {
// 键存在,value是对应的值
} else {
// 键不存在
}
示例2:将包含单一元素的切片转换为map(使用索引作为键)
如果你想使用切片的索引作为map的键,可以将索引直接用作键。
package main
import (
"fmt"
)
func main() {
names := []string{"Alice", "Bob", "Charlie"}
// 使用map的键类型为int(索引),值类型为string(元素)
namesMap := make(map[int]string)
for index, name := range names {
namesMap[index] = name
}
fmt.Println(namesMap) // 输出: map[0:Alice 1:Bob 2:Charlie]
}
示例3:将切片转换为不同类型的map(例如,将结构体切片转换为另一个结构体的map)
package main
import (
"fmt"
)
type Person struct {
ID string
Name string
}
type PersonInfo struct {
FullName string // 假设我们想存储全名信息,例如 Name + " " + Surname
}
func main() {
people := []Person{
{"1", "Alice"},
{"2", "Bob"},
}
// 创建一个map,其值为PersonInfo类型的新结构体,包含全名信息。
peopleInfoMap := make(map[string]PersonInfo) // 使用ID作为键,因为它是唯一的标识符。
for _, person := range people {
peopleInfoMap[person.ID] = PersonInfo{FullName: person.Name + " Doe"} // 假设Surname是 Doe,仅为示例。
}
fmt.Println(peopleInfoMap) // 输出: map[1:{Alice Doe} 2:{Bob Doe}]
}
四:去除切片中的空值
func FilterSlice(list []string) (result []string) {
for _, value := range list {
if value != "" {
result = append(result, value)
}
}
return
}
五:去除切片中的重复值
func UniqueSlice(list []string) (result []string) {
// 存储每个元素的数量
countEle := make(map[string]int)
for _, value := range list {
countEle[value] += 1
if countEle[value] > 1 {
continue
}
result = append(result, value)
}
return
}
六:将多个同类型切片合并成一个切片
func MergeSlice(list ...[]string) (result []string) {
for _, value := range list {
for _, v := range value {
result = append(result, v)
}
}
return
}
七:将多个map合并成一个map
和切片的合并一样。如果合并的map中键有重复,则后面的键值会覆盖前面的。小白需要注意的是,map使用前需要初始化。
另外,如果方法要传固定参数,固定参数需要放到可变参数前面。
func MergeMap(mapList ...map[string]string) map[string]string {
result := make(map[string]string)
for _, value := range mapList {
for k, v := range value {
result[k] = v
}
}
return result
}
八:用于合并两个go map
package main
import "fmt"
// MergeMaps 创建一个新的 map 用于保存合并后的值。返回新的 map。
func MergeMaps(destMap, sourceMap map[string]interface{}) map[string]interface{} {
newMap := make(map[string]interface{})
// 将目标 map 的元素复制到新 map 中
for key, value := range destMap {
newMap[key] = value
}
// 将源 map 中的元素合并到新 map 中
for key, value := range sourceMap {
newMap[key] = value
}
return newMap
}
func main() {
map1 := map[string]interface{}{"key1": "value1", "key2": "value2"}
map2 := map[string]interface{}{"key2": "new value2", "key3": "value3"}
result := MergeMaps(map1, map2)
fmt.Println(result) // Output: map[key1:value1 key2:new value2 key3:value3]
}
九:
十:
更多推荐

所有评论(0)