1.go語言的接口實現
接口(interface)是一種類型,它定義了一組方法的集合。任何類型只要實現了接口中定義的所有方法,就被認為實現了該接口。
在Go語言中,使用接口的最佳實踐可以提高代碼的可讀性、可維護性和靈活性。
- 小接口與大接口: 盡量設計小接口,一個接口應該只包含少量的方法,而不是設計一個大而全的接口。這樣可以避免實現接口時不必要的負擔,并使接口更具通用性。
- 基于使用場景設計接口: 設計接口時應該考慮使用場景,而不是從具體的實現出發。思考在你的應用程序中如何使用接口,以及接口應該提供哪些方法來滿足這些使用場景。
- 使用合適的命名: 為接口和方法使用清晰的命名,使其能夠表達出其用途和功能。命名應該具有可讀性和表達性,讓其他開發者能夠輕松理解接口的用途。
- 避免不必要的接口: 不要為每個類型都創建一個接口,只有在多個類型之間確實存在共享的行為和功能時才使用接口。不要過度使用接口,以免導致不必要的復雜性。
- 使用接口作為函數參數和返回值: 使用接口作為函數參數和返回值,可以使函數更加通用,允許傳入不同類型的參數,并返回不同類型的結果。這可以提高代碼的復用性和擴展性。
- 注釋和文檔: 為接口提供清晰的文檔和注釋,說明接口的用途、方法的功能和預期行為。這可以幫助其他開發者更好地理解接口的使用方式。
- 用例驅動設計: 在設計接口時,可以從使用的角度出發,先考慮接口在實際場景中如何被調用,然后再設計接口的方法和簽名。
- 將接口的實現與定義分離: 將接口的實現與接口的定義分開,這樣可以使實現更靈活,可以在不修改接口定義的情況下實現新的類型。
- 默認實現: 在接口定義中,可以為某些方法提供默認實現,從而減少實現接口時的工作量。這對于可選方法或者某些方法的默認行為很有用。
- 使用空接口謹慎: 使用空接口(
interface{}
)應謹慎,因為它會降低類型安全性。只有在確實需要處理不同類型的值時才使用空接口,同時要注意類型斷言和錯誤處理。
設計和使用接口時要根據實際需求和項目的特點來選擇合適的方案。
package mainimport "fmt"type Shape interface {Area() float64Perimeter() float64
}type Rectangle struct {Width float64Height float64
}func (r Rectangle) Area() float64 {return r.Width * r.Height
}func (r Rectangle) Perimeter() float64 {return 2 * (r.Height + r.Width)
}func main() {var s Shaperect := Rectangle{Height: 3, Width: 4}s = rectfmt.Println("面積:", s.Area())fmt.Println("周長:", s.Perimeter())
}// 理解與記憶方法
// 1接口是方法的集合:接口定義了一組方法,任何類型實現了這些方法就實現了接口。
// 2隱式實現:Go 不需要顯式聲明實現某個接口,只要類型的方法集包含接口的所有方法即可。
// 3空接口:interface{} 是最通用的接口,可存儲任何類型值,用于靈活性需求。
// 4接口值的內部結構:接口值包含動態類型信息和實際數據值,支持類型斷言和類型切換。
// 5鴨子類型:如果一個東西走起來像鴨子,叫起來也像鴨子,那么它就是鴨子。即,只要類型實現了接口的方法,就被認為實現了接口。
輸出結果:
Running] go run "d:\Microsoft VS Code\GOproject\src\go_code\chapter\interface\testshape\shape.go"
面積: 12
周長: 14[Done] exited with code=0 in 0.911 seconds
2.go語言中如何訪問私有成員
導出公有方法(get和set)
package mainimport "fmt"//定義一個結構體
type Person struct {name stringage int
}//導出Get方法,獲取Name
func (p *Person) GetName() string {return p.name
}//導出Set方法,設置Name
func (p *Person) SetName(newName string) {p.name = newName
}//導出Get方法,獲取Age
func (p *Person) GetAge() int {return p.age
}//導出Set方法,設置Age
func (p *Person) SetAge(newAge int) {if newage > 0 {p.Age = newage} else {fmt.Println("年齡不能為負")}
}func main() {//創建zhangsan實例person := Person{name: "zhangsan",age: 18,}//調用Get方法fmt.Println("姓名:", person.GetName())fmt.Println("年齡:", person.GetAge())//輸出結果:// 姓名: zhangsan// 年齡: 18//調用Set方法person.SetName("Lis")person.SetAge(20)fmt.Println("新名字:", person.GetName())fmt.Println("新年齡:", person.GetAge())//測試非法參數person.SetAge(-18)
}
輸出結果:
[Running] go run "d:\Microsoft VS Code\GOproject\src\go_code\chapter4\main.go"
姓名: zhangsan
年齡: 18
新名字: Lis
新年齡: 20
年齡不能為負[Done] exited with code=0 in 1.271 seconds
3.《剪刀石頭布》游戲;
設計思路:石頭剪刀布分別用0、1、2,來表示
系統隨機輸出一個數字,用戶通過命令行輸入數字,進行對比,決定出是用戶獲勝還是系統獲勝(采用數學思想),設計避免用戶輸入其他數字,輸入其他數字輸出“請輸入正確的數字”,然后重新讓用戶輸入。
package mainimport ("bufio" // 用于讀取用戶輸入"fmt""math/rand""os""strconv""strings""time"
)func main() {// 初始化隨機數種子localRand := rand.New(rand.NewSource(time.Now().UnixNano()))// 初始化隨機數種子computer := localRand.Intn(3)// 獲取用戶的有效輸入user := getUserInput()// 顯示雙方選擇names := []string{"石頭", "剪刀", "布"}// 顯示對戰結果fmt.Printf("\n你出了%s,系統出了%s。\n", names[user], names[computer])//判斷并顯示結果switch determineWinner(user, computer) {case 0:fmt.Println("平局")case 1:fmt.Println("你贏了!好膩害呀!")case -1:fmt.Println("系統贏了!")}
}// 判斷勝負函數
func determineWinner(user, computer int) int {//使用數學公式判斷勝負關系switch (user - computer + 3) % 3 {case 0:return 0 //平局case 1:return -1 //系統贏default:return 1 //用戶贏}
}func getUserInput() int {reader := bufio.NewReader(os.Stdin)// 使用無限循環直到獲得有效輸入for {fmt.Print("請出拳(0: 石頭,1: 剪刀,2: 布):")// 讀取輸入直到遇到換行符(Windows系統注意換行符是\r\n)input, _ := reader.ReadString('\n')// 去除首尾空白字符(包括可能的空格和換行符)input = strings.TrimSpace(input)// 將字符串轉換為整數num, err := strconv.Atoi(input)if err != nil {fmt.Println("請輸入整數") // 處理非數字輸入continue}// 驗證輸入范圍(建議先顯示錯誤再判斷范圍)if num < 0 || num > 2 {fmt.Println("請輸入0-2之間的數字!")continue}return num}
}
測試:
PS D:\Microsoft VS Code\GOproject\src\go_code\project1> go run .\3-1.go
請出拳(0: 石頭,1: 剪刀,2: 布):1你出來剪刀,系統出了剪刀。
平局
PS D:\Microsoft VS Code\GOproject\src\go_code\project1> go run .\3-1.go
請出拳(0: 石頭,1: 剪刀,2: 布):3
請輸入0-2之間的數字!
請出拳(0: 石頭,1: 剪刀,2: 布):4
請輸入0-2之間的數字!
請出拳(0: 石頭,1: 剪刀,2: 布):2你出來布,系統出了布。
平局
PS D:\Microsoft VS Code\GOproject\src\go_code\project1> go run .\3-1.go
請出拳(0: 石頭,1: 剪刀,2: 布):1你出來剪刀,系統出了布。
你贏了!好膩害呀!
PS D:\Microsoft VS Code\GOproject\src\go_code\project1> go run .\3-1.go
請出拳(0: 石頭,1: 剪刀,2: 布):0你出了石頭,系統出了剪刀。
你贏了!好膩害呀!
PS D:\Microsoft VS Code\GOproject\src\go_code\project1>
4. 猜數字游戲
一個小游戲:在0-999之間隨機生成一個數,用戶在終端進行猜測,假設說生成的數字是100,用戶第一次猜200,那么就提示用戶“答案在在0-200區間”,以此類推,直到用戶答出爭取的數字,并輸出”您成功答出正確答案:答案;共猜了n次“
package mainimport ("bufio" // 用于讀取用戶輸入"fmt""math/rand""os""strconv""strings"
)func main() {// 初始化隨機數種子target := rand.Intn(1000)low, high := 0, 999attempts := 0reader := bufio.NewReader(os.Stdin)fmt.Println("數字猜謎游戲開始!請輸入0-999的隨機整數:")for {fmt.Printf("(%d嘗試,當前范圍[%d-%d])", attempts, low, high)input, _ := reader.ReadString('\n')input = strings.TrimSpace(input)reader.Reset(os.Stdin)guess, err := strconv.Atoi(input)if err != nil || guess < low || guess > high {fmt.Printf("請輸入%d-%d范圍內的有效整數\n", low, high)continue}attempts++if guess == target {fmt.Printf("您成功答出正確答案:%d(共嘗試%d次)\n", target, attempts)break} else if guess > target {high = guess - 1fmt.Printf("答案在更小的范圍內\n")} else {low = guess + 1fmt.Printf("答案在更大的范圍內\n")}}
}
輸出測試:
PS D:\Microsoft VS Code\GOproject\src\go_code\project2> go run .\1.go
數字猜謎游戲開始!請輸入0-999的隨機整數:
(0嘗試,當前范圍[0-999])500
答案在更小的范圍內
(1嘗試,當前范圍[0-499])300
答案在更大的范圍內
(2嘗試,當前范圍[301-499])400
答案在更小的范圍內
(3嘗試,當前范圍[301-399])150
請輸入301-399范圍內的有效整數
(3嘗試,當前范圍[301-399])350
答案在更大的范圍內
(4嘗試,當前范圍[351-399])375
答案在更大的范圍內
(5嘗試,當前范圍[376-399])190
請輸入376-399范圍內的有效整數
(5嘗試,當前范圍[376-399])390
答案在更小的范圍內
(6嘗試,當前范圍[376-389])380
答案在更大的范圍內
(7嘗試,當前范圍[381-389])385
答案在更大的范圍內
(8嘗試,當前范圍[386-389])388
答案在更大的范圍內
(9嘗試,當前范圍[389-389])389
您成功答出正確答案:389(共嘗試10次)
PS D:\Microsoft VS Code\GOproject\src\go_code\project2>
簡易學生查詢系統
使用Go語言寫一個教學管理系統,存儲學生名字、學生年齡、學生班級、學習成績(ABCDE由高到低),然后給用戶一個終端輸入的模塊,輸入1查詢學生的基本信息(名字、班級年齡),輸入2查詢學生成績,輸入3添加學生信息,輸入4刪除學生信息,輸入5查詢所有學生信息,輸入6退出系統;要注意其中輸入非指定信息出現的問題如何解決,開始吧。
代碼實現:
package main// 導入需要的包
import ("bufio" // 用于讀取輸入"fmt" // 用于輸入輸出格式化"os" // 用于操作系統交互"strconv" // 用于字符串和數字轉換"strings" // 用于字符串處理
)// 定義學生結構體,用于存儲單個學生的完整信息
type Student struct {Name string // 學生姓名Age int // 學生年齡Class string // 學生所在班級Grade string // 學生成績等級(A-E)
}// 全局變量:使用切片存儲所有學生信息(切片是動態數組,可以自動擴展)
var students []Student// 查詢學生基本信息函數
func queryStudentInfo(scanner *bufio.Scanner) {fmt.Print("請輸入要查詢的學生姓名:")scanner.Scan() // 讀取用戶輸入name := strings.TrimSpace(scanner.Text()) // 去除前后空格found := false // 標記是否找到學生// 遍歷所有學生for _, s := range students {// 使用不區分大小寫的比較(比如輸入"zhangsan"可以匹配"ZhangSan")if strings.EqualFold(s.Name, name) {// 使用格式化輸出顯示學生信息fmt.Printf("\n學生信息:\n姓名:%s\n年齡:%d\n班級:%s\n",s.Name, s.Age, s.Class)found = true}}if !found {fmt.Println("未找到該學生信息")}
}// 查詢學生成績函數
func queryStudentGrade(scanner *bufio.Scanner) {fmt.Print("請輸入要查詢成績的學生姓名:")scanner.Scan()name := strings.TrimSpace(scanner.Text())found := false// 遍歷學生切片查找匹配項for _, s := range students {if strings.EqualFold(s.Name, name) {fmt.Printf("\n學生成績:\n姓名:%s\n成績:%s\n",s.Name, s.Grade)found = true}}if !found {fmt.Println("未找到該學生信息")}
}// 添加學生信息函數
func addStudent(scanner *bufio.Scanner) {var student Student // 創建新的學生對象// 收集學生信息并進行驗證fmt.Print("請輸入學生姓名:")scanner.Scan()student.Name = strings.TrimSpace(scanner.Text())fmt.Print("請輸入學生年齡:")scanner.Scan()// 將字符串轉換為整數,并進行有效性檢查age, err := strconv.Atoi(strings.TrimSpace(scanner.Text()))if err != nil || age < 0 { // 檢查是否為合法年齡fmt.Println("無效的年齡輸入")return // 直接返回,不繼續執行}student.Age = agefmt.Print("請輸入學生班級:")scanner.Scan()student.Class = strings.TrimSpace(scanner.Text())fmt.Print("請輸入學生成績(ABCDE):")scanner.Scan()// 處理成績輸入:轉換為大寫并去除空格grade := strings.ToUpper(strings.TrimSpace(scanner.Text()))if !isValidGrade(grade) { // 檢查成績是否合法fmt.Println("無效的成績輸入")return}student.Grade = grade// 將新學生添加到全局切片中students = append(students, student)fmt.Println("學生信息添加成功!")
}// 刪除學生信息函數
func deleteStudent(scanner *bufio.Scanner) {fmt.Print("請輸入要刪除的學生姓名:")scanner.Scan()name := strings.TrimSpace(scanner.Text())// 創建新切片保存保留的學生newStudents := make([]Student, 0)found := false// 遍歷所有學生,過濾掉要刪除的for _, s := range students {if strings.EqualFold(s.Name, name) {found = true // 標記找到要刪除的學生} else {// 將不需要刪除的學生加入新切片newStudents = append(newStudents, s)}}if found {students = newStudents // 用新切片替換原切片fmt.Println("學生信息刪除成功!")} else {fmt.Println("未找到該學生信息")}
}// 顯示所有學生信息函數
func displayAllStudent() {// 處理空數據情況if len(students) == 0 {fmt.Println("當前沒有學生信息")return}// 使用表格形式展示數據fmt.Println("\n所有學生信息:")fmt.Println("========================================")// 遍歷切片,i是索引(從0開始),s是學生對象for i, s := range students {// 格式化輸出:%-8s表示左對齊,占8個字符寬度fmt.Printf("%d. 姓名:%-8s 年齡:%-3d 班級:%-6s 成績:%s\n",i+1, s.Name, s.Age, s.Class, s.Grade)}fmt.Println("========================================")fmt.Printf("共 %d 條學生記錄\n", len(students))
}// 驗證成績是否合法的函數
func isValidGrade(grade string) bool {// 使用map實現快速查找,合法成績字典validGrades := map[string]bool{"A": true,"B": true,"C": true,"D": true,"E": true,}return validGrades[grade] // 返回查找結果
}// 主函數:程序入口
func main() {// 創建輸入掃描器,用于讀取標準輸入(鍵盤輸入)scanner := bufio.NewScanner(os.Stdin)// 無限循環顯示菜單,直到用戶選擇退出for {// 打印菜單選項fmt.Println("\n教學管理系統")fmt.Println("1. 查詢學生基本信息")fmt.Println("2. 查詢學生成績")fmt.Println("3. 添加學生信息")fmt.Println("4. 刪除學生信息")fmt.Println("5. 顯示所有學生信息")fmt.Println("6. 退出系統")fmt.Print("請選擇操作編號:")scanner.Scan() // 等待用戶輸入input := strings.TrimSpace(scanner.Text()) // 處理輸入// 使用switch-case處理用戶選擇switch input {case "1":queryStudentInfo(scanner)case "2":queryStudentGrade(scanner)case "3":addStudent(scanner)case "4":deleteStudent(scanner)case "5":displayAllStudent()case "6":fmt.Println("感謝使用,再見!")return // 結束程序default:fmt.Println("無效的輸入,請重新輸入")}}
}
進行測試:
PS D:\Microsoft VS Code\GOproject\src\go_code\student> .\studentmain.exe教學管理系統
1. 查詢學生基本信息
2. 查詢學生成績
3. 添加學生信息
4. 刪除學生信息
5. 顯示所有學生信息
6. 退出系統
請選擇操作編號:1
請輸入要查詢的學生姓名:hzy
未找到該學生信息教學管理系統
1. 查詢學生基本信息
2. 查詢學生成績
3. 添加學生信息
4. 刪除學生信息
5. 顯示所有學生信息
6. 退出系統
請選擇操作編號:3
請輸入學生姓名:hzy
請輸入學生年齡:19
請輸入學生班級:Cloud1
請輸入學生成績(ABCDE):A
學生信息添加成功!教學管理系統
1. 查詢學生基本信息
2. 查詢學生成績
3. 添加學生信息
4. 刪除學生信息
5. 顯示所有學生信息
6. 退出系統
請選擇操作編號:
無效的輸入,請重新輸入教學管理系統
1. 查詢學生基本信息
2. 查詢學生成績
3. 添加學生信息
4. 刪除學生信息
5. 顯示所有學生信息
6. 退出系統
請選擇操作編號:1
請輸入要查詢的學生姓名:hzy 學生信息:
姓名:hzy
年齡:19
班級:Cloud1教學管理系統
1. 查詢學生基本信息
2. 查詢學生成績
3. 添加學生信息
4. 刪除學生信息
5. 顯示所有學生信息
6. 退出系統
請選擇操作編號:2
請輸入要查詢成績的學生姓名:hzy學生成績:
姓名:hzy
成績:A教學管理系統
1. 查詢學生基本信息
2. 查詢學生成績
3. 添加學生信息
4. 刪除學生信息
5. 顯示所有學生信息
6. 退出系統
請選擇操作編號:5所有學生信息:
========================================
1. 姓名:hzy 年齡:19 班級:Cloud1 成績:A
========================================
共 1 條學生記錄教學管理系統
1. 查詢學生基本信息
2. 查詢學生成績
3. 添加學生信息
4. 刪除學生信息
5. 顯示所有學生信息
6. 退出系統
請選擇操作編號:4
請輸入要刪除的學生姓名:hzy
學生信息刪除成功!教學管理系統
1. 查詢學生基本信息
2. 查詢學生成績
3. 添加學生信息
4. 刪除學生信息
5. 顯示所有學生信息
6. 退出系統
請選擇操作編號:5
當前沒有學生信息教學管理系統
1. 查詢學生基本信息
2. 查詢學生成績
3. 添加學生信息
4. 刪除學生信息
5. 顯示所有學生信息
6. 退出系統
請選擇操作編號:6
感謝使用,再見!
PS D:\Microsoft VS Code\GOproject\src\go_code\student>
文件查找:
使用Go語言做一個簡易的文件查詢系統,比如在某個文件夾下,存放一些.txt文件,現在使用Go語言去搜索文件名,搜索文件名之后直接查看文件,類似于Linux里面的ls命令找到文件后使用cat命令一個道理。開始吧。
// 文件查詢系統 - 支持按名稱搜索文本文件并查看內容
package main// 導入所需的標準庫包
import ("bufio" // 帶緩沖的輸入輸出處理"fmt" // 格式化輸入輸出"os" // 操作系統功能(文件、目錄操作)"path/filepath" // 跨平臺文件路徑處理"strconv" // 字符串與數值類型轉換"strings" // 字符串處理工具
)// 配置常量(建議根據實際情況修改路徑)
const (searchDir = "D:/Microsoft VS Code/GOproject/src/go_code/txtlist" // 要搜索的根目錄fileExt = ".txt" // 要搜索的文件擴展名
)// searchFile 文件搜索主功能
// scanner: 從標準輸入讀取數據的掃描器
func searchFile(scanner *bufio.Scanner) {// 獲取用戶搜索關鍵詞fmt.Print("\n請輸入關鍵詞:")scanner.Scan()keyword := strings.TrimSpace(scanner.Text()) // 去除前后空格// 執行文件搜索files, err := findFiles(keyword)if err != nil {fmt.Printf("搜索失敗: %v\n", err)return}// 處理空結果情況if len(files) == 0 {fmt.Println("沒有找到匹配的文件")return}// 顯示搜索結果列表fmt.Println("\n找到以下文件:")for i, file := range files {fmt.Printf("%d. %s\n", i+1, file) // 顯示帶編號的文件路徑}// 處理用戶選擇fmt.Print("\n請輸入編號查看文件內容(輸入0返回上級):")scanner.Scan()choice := strings.TrimSpace(scanner.Text())// 轉換用戶輸入為數字index, err := strconv.Atoi(choice)// 驗證輸入有效性(重要!防止無效輸入導致程序崩潰)if err != nil || index < 0 || index > len(files) {fmt.Println("無效的選擇")return}// 顯示選定文件內容if index > 0 {showFileContent(files[index-1]) // 注意索引從1開始顯示,實際存儲從0開始}
}// showFileContent 顯示文件內容
// filePath: 要顯示文件的完整路徑
func showFileContent(filePath string) {// 讀取文件全部內容(適用于小文件)content, err := os.ReadFile(filePath)if err != nil {fmt.Printf("讀取文件失敗:%v\n", err)return}// 格式化輸出文件內容fmt.Printf("\n文件內容 [%s]:\n%s\n",filepath.Base(filePath), // 僅顯示文件名(不含路徑)string(content)) // 字節切片轉字符串// 暫停等待用戶確認fmt.Println("------------------------------")fmt.Print("按回車鍵繼續...")bufio.NewReader(os.Stdin).ReadBytes('\n') // 讀取直到回車鍵
}// findFiles 遞歸查找匹配文件
// keyword: 搜索關鍵詞(不區分大小寫)
// 返回值: 匹配文件路徑切片,錯誤信息
func findFiles(keyword string) ([]string, error) {var matches []string // 存儲匹配文件路徑// 檢查目錄是否存在(重要錯誤處理)if _, err := os.Stat(searchDir); os.IsNotExist(err) {return nil, fmt.Errorf("目錄不存在: %s", searchDir)}// 遞歸遍歷目錄(核心文件搜索邏輯)err := filepath.Walk(searchDir, func(path string, info os.FileInfo, err error) error {// 錯誤優先處理原則if err != nil {return fmt.Errorf("訪問路徑失敗: %w", err) // 包裝錯誤信息}// 篩選條件(同時滿足三個條件):// 1. 是文件(非目錄)// 2. 擴展名匹配// 3. 文件名包含關鍵詞(不區分大小寫)if !info.IsDir() &&strings.HasSuffix(info.Name(), fileExt) &&strings.Contains(strings.ToLower(info.Name()), strings.ToLower(keyword)) {matches = append(matches, path) // 記錄匹配路徑}return nil // 必須返回nil表示繼續遍歷})return matches, err
}// main 程序入口函數
func main() {// 創建標準輸入掃描器scanner := bufio.NewScanner(os.Stdin)// 主循環(保持程序持續運行)for {// 顯示操作菜單fmt.Print("\n文件查詢系統\n")fmt.Println("1. 搜索文件")fmt.Println("2. 退出系統")fmt.Print("請選擇操作:")// 獲取用戶輸入scanner.Scan()input := strings.TrimSpace(scanner.Text())// 處理菜單選擇switch input {case "1":searchFile(scanner)case "2":fmt.Println("感謝使用,再見!")return // 結束程序default:fmt.Println("無效的輸入,請重新選擇")}}
}
測試結果:(提前準備一些測試文件)
PS D:\Microsoft VS Code\GOproject\src\go_code\foundtxt> go run .\foundtxt.go文件查詢系統
1. 搜索文件
2. 退出系統
請選擇操作:1請輸入關鍵詞:yum找到以下文件:
1. D:\Microsoft VS Code\GOproject\src\go_code\txtlist\yum.txt請輸入編號查看文件內容(輸入0返回上級):
無效的選擇文件查詢系統
1. 搜索文件
2. 退出系統
請選擇操作:1 請輸入關鍵詞:yum找到以下文件:
1. D:\Microsoft VS Code\GOproject\src\go_code\txtlist\yum.txt請輸入編號查看文件內容(輸入0返回上級):1文件內容 [yum.txt]:
yum 可以下載文件。
------------------------------
按回車鍵繼續...文件查詢系統
1. 搜索文件
2. 退出系統
請選擇操作:無效的輸入,請重新選擇文件查詢系統
1. 搜索文件
2. 退出系統
exit status 0xc000013a
PS D:\Microsoft VS Code\GOproject\src\go_code\foundtxt>