package main

import (
	"encoding/hex"
	"errors"
	"github.com/tjfoc/gmsm/sm3"
	"reflect"
)

func main() {

	s := new(string)
	if s == nil {
		VarAssignment(s, "/home")
	}
	VarAssignment(s, "/")
	println(*s)
}

// VarAssignment 变量赋值
func VarAssignment(to, from any) error {
	var oldTv, oldFv, tv, fv reflect.Value
	tv = reflect.ValueOf(to)
	fv = reflect.ValueOf(from)
	if _, ok := to.(reflect.Value); ok {
		tv = to.(reflect.Value)
	}
	if _, ok := from.(reflect.Value); ok {
		fv = from.(reflect.Value)
	}
	if _, ok := to.(*reflect.Value); ok {
		tv = *(to.(*reflect.Value))
	}
	if _, ok := from.(*reflect.Value); ok {
		fv = *(from.(*reflect.Value))
	}

	oldTv = tv
	oldFv = fv

	if tv.IsNil() {
		return errors.New("The target data cannot be nil\n")
	}
	// 判断目标变量类型是否为指针类型，非指针类型返回错误
	if tv.Kind() == reflect.Ptr {
		tv = tv.Elem()
	} else {
		return errors.New("The target variable must be of pointer type ")
	}
	if fv.Kind() == reflect.Ptr {
		fv = fv.Elem()
	}

	// 判断目标变量类型和原变量类型是否一致
	if oldTv.Type().Elem().Kind() != fv.Kind() {
		return errors.New("Inconsistent data types ")
	}

	// 判断来源变量是否为空指针，如果为空指针则直接退出
	if oldFv.IsZero() && oldFv.Kind() == reflect.Ptr {
		return nil
	}

	// 判断目标变量是否为空，如果为空则创建内存空间
	if oldTv.IsZero() {
		val := reflect.New(oldTv.Type().Elem())
		oldTv.Set(val)
	}
	oldTv.Elem().Set(fv)
	return nil
}
func SM3SUM(in string) string {
	sm3Sum := sm3.Sm3Sum([]byte(in))
	return hex.EncodeToString(sm3Sum)
}

//package main
//
//import (
//	"fmt"
//	"net"
//)
//
//func main() {
//	netInterfaces, err := net.Interfaces()
//	if err != nil {
//		fmt.Println("net.Interfaces failed, err:", err.Error())
//		return
//	}
//
//	for i := 0; i < len(netInterfaces); i++ {
//		if (netInterfaces[i].Flags & net.FlagUp) != 0 {
//			addrs, _ := netInterfaces[i].Addrs()
//			for _, address := range addrs {
//				if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
//					if ipnet.IP.To4() != nil {
////						fmt.Println(netInterfaces[i].Name)
//						fmt.Println(ipnet.IP.String())
//					}
//				}
//			}
//		}
//	}
//
//	return
//}

//import (
//	"fmt"
//	"github.com/gin-gonic/gin"
//	"github.com/xuri/excelize/v2"
//	"net/http"
//)
//
//func main() {
//	r := gin.Default()
//	r.POST("/upload", func(c *gin.Context) {
//		file, err := c.FormFile("file") // 假设表单字段名为"file"
//		if err != nil {
//			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
//			return
//		}
//
//		// 保存上传的文件到本地临时目录
//		tempFile, err := file.Open()
//		if err != nil {
//			c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
//			return
//		}
//		defer tempFile.Close()
//
//		// 使用excelize解析Excel文件
//		f, err := excelize.OpenReader(tempFile)
//		if err != nil {
//			c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to open Excel file."})
//			return
//		}
//
//		// 示例：读取第一个工作表的第一行数据
//		sheetName := f.GetSheetName(0)
//		rows, err := f.GetRows(sheetName)
//		if err != nil {
//			c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to read rows from Excel."})
//			return
//		}
//
//		// 处理数据，这里简单打印出来
//		for _, row := range rows {
//			fmt.Println(row)
//		}
//
//		c.JSON(http.StatusOK, gin.H{"message": "File uploaded and parsed successfully!"})
//	})
//
//	r.Run(":8080") // 启动服务器
//}

//package main
//
//import (
//	"os"
//	"text/template"
//)
//
//type Config struct {
//	ImageURL  string
//	ScriptURL string
//	ISO       string
//}
//
//func main() {
//	// 创建一个Config对象，用于替换模板中的字段
//	config := Config{
//		ImageURL:  "http://example.com/images",
//		ScriptURL: "http://example.com/scripts",
//		ISO:       "ubuntu.iso",
//	}
//
//	// 模板字符串
//	templateStr := `#!ipxe
//dhcp
//
//set base-url {{ .ImageURL }} #请替换为镜像所在的HTTP文件服务器地址
//
//set ks-file {{ .ScriptURL }}  # 替换为你的 Kickstart 文件所在的 HTTP 服务器地址
//
//set iso {{.ISO}}
//
//kernel ${base-url}/images/pxeboot/vmlinuz initrd=initrd.img inst.repo=${base-url} ip=dhcp  ks=${ks-url}  # 指定 Kickstart 文件的位置和参数
//initrd ${base-url}/images/pxeboot/initrd.img
//boot
//`
//
//	// 创建模板对象
//	tmpl, err := template.New("ipxeTemplate").Parse(templateStr)
//	if err != nil {
//		panic(err)
//	}
//	create, _ := os.Create("auto.ipxe")
//	// 执行模板并输出结果
//	if err := tmpl.Execute(create, config); err != nil {
//		panic(err)
//	}
//}

//	func main() {
//		nums := []int{}
//		for _, num := range nums {
//			println(num)
//		}
//	}
/*package main

import (
	"fmt"
	"os"
)

// FileContent 结构体用于存储文件名和内容
type FileContent struct {
	FileName string
	Content  string
}

func main() {
	dir := "D:\\GolandProjects\\demo3\\demo3.8" // 替换为实际的文件夹路径

	files, err := os.ReadDir(dir)
	if err != nil {
		fmt.Println("Error reading directory:", err)
		return
	}

	var fileContents []FileContent

	for _, file := range files {
		if file.IsDir() {
			continue // 忽略文件夹
		}

		fileName := file.Name()
		filePath := dir + "/" + fileName

		content, err := os.ReadFile(filePath)
		if err != nil {
			fmt.Println("Error reading file:", err)
			continue
		}

		fileContents = append(fileContents, FileContent{
			FileName: fileName,
			Content:  string(content),
		})
	}

	// 打印文件名和内容
	for _, fc := range fileContents {
		fmt.Println("File Name:", fc.FileName)
		fmt.Println("Content:", fc.Content)
		fmt.Println()
	}
}*/

//package main
//
//import (
//	"fmt"
//	"strings"
//)
//
//func main() {
//	baseURL := "http://172.17.103.111:8080/file/images/ipxe/centos-min/cas.ipxe"
//	lastSlashIndex := strings.LastIndex(baseURL, "/")
//	if lastSlashIndex != -1 {
//		baseURL = baseURL[:lastSlashIndex]
//	}
//	fmt.Println(baseURL)
//}

//package main
//
//import (
//	"fmt"
//	"net"
//)
//
//func main() {
//	// 获取所有网络接口
//	ifaces, err := net.Interfaces()
//	if err != nil {
//		fmt.Println("Failed to get interfaces:", err)
//		return
//	}
//
//	// 遍历网络接口
//	for _, iface := range ifaces {
//		fmt.Printf("Interface: %s\n", iface.Name)
//
//		// 获取接口的所有地址
//		addrs, err := iface.Addrs()
//		if err != nil {
//			fmt.Println("Failed to get interface addresses:", err)
//			continue
//		}
//
//		// 遍历并打印每个地址
//		for _, addr := range addrs {
//			var ip net.IP
//			switch v := addr.(type) {
//			case *net.IPNet:
//				ip = v.IP
//			case *net.IPAddr:
//				ip = v.IP
//			}
//
//			// 排除IPv6地址和回环地址
//			if ip == nil || ip.IsLoopback() {
//				continue
//			}
//
//			// 打印IP地址和MAC地址
//			fmt.Printf("  IP: %s\tMAC: %s\n", ip.String(), iface.HardwareAddr.String())
//		}
//	}
//}
