Go 入門實戰

Go 入門級別實戰

看了一段時間的 Go 基礎語法,總以爲缺了點什麼,因此今天就想試試寫點什麼緩存

附.目錄結構

這裏寫圖片描述

binary.gocache.gofibonacci.go 都屬於 chestnut_math 包測試

main.exe 爲構建後的可執行文件ui

main.go 爲 main 包 主入口文件spa

test.go 一個單獨的 main 包 測試用(獨立)code

一. 斐波那契數列

原理其實很簡單,就是一個遞歸...orm

1.求值代碼

這是 fibonacci.go 文件代碼遞歸

package chestnut_math

// 獲取斐波那契數列指定位對應值
func GetFibonacci(int_num uint64) uint64 {

    if int_num < 3 { return 1

    } else { return GetFibonacci(int_num - 2) + GetFibonacci(int_num - 1) }
    
}

2.緩存

爲何寫個緩存方法呢?由於是位數越大耗時越長,但畢竟值是不變的,因此不須要每次都從新算一遍圖片

cache.go 文件ci

package chestnut_math

// 斐波那契集合
var map_fibonacci = make(map[string]string)

// 緩存斐波那契
func CacheFibonacci(key string, value string) {
    
    _, validate := map_fibonacci[key]

    if !validate { map_fibonacci[key] = value }

}

// 獲取緩存
func GetCache(key string) string {

    value, validate := map_fibonacci[key]

    if validate { return value 
    
    } else { return "" }

}

二.十進制轉二進制

binary.go 文件rem

// 十進制轉二進制
func Dtob (read_line []byte) string {

    read_line_string := string(read_line)

    int_current, error := strconv.Atoi(read_line_string)

    if error != nil { fmt.Println(error)}

    var string_binary string

    for true {

        if int_current < 1 { return string_binary }

        string_binary = strconv.Itoa( int_current % 2 ) + string_binary

        int_current /= 2
    }
    return "0"
}

三.二進制轉十進制

binary.go 文件

// 二進制轉十進制
func Btod(read_line []byte) int {

    var value_sum, value_square int

    for index, value := range read_line {

        value_int, error := strconv.Atoi(string(value))

        if error != nil { fmt.Println(error) }

        index_new := len(read_line) - 1 - index
        
        if index_new == 0 { value_square = 1

        } else { value_square = 2 << uint(index_new - 1)}

        value_sum += value_int * value_square
    }
    return value_sum

}

四.main包

seaconch 在實踐中遇到一個問題,那就是在循環(也包括goto)中使用 fmt.Scanf 接收輸入時老是會出現跳過一次輸入的問題

經過查詢資料得出結論可能和 fmt.Scanf 讀取回車鍵有關係

沒有找到什麼好的解決方法,最好只好將獲取輸入的方式所有改爲了 reader.ReadLine() 的方式

相應的以後的一些類型轉換也作的不是很好,不過應該會找到更好的解決方法的

main.go 文件

package main

import (
    "strconv"
    "os"
    "bufio"
    "fmt"
    "./chestnut_math"
)

func main() {

    fmt.Println(" ❤ 歡迎使用 Go 進制轉換小助手 v 0.1 ❤ ")

    reader := bufio.NewReader(os.Stdin)

    for true {

        fmt.Println("+——————————————————")

        fmt.Println("| 輸入 1 進行斐波那契數列求值計算")

        fmt.Println("| 輸入 2 進行十進制轉換二進制計算")

        fmt.Println("| 輸入 3 進行二進制轉換十進制計算")

        fmt.Println("+——————————————————")

        read_line_select, _, _ := reader.ReadLine()

        read_line_select_string := string(read_line_select)

        switch read_line_select_string {

            case "1" : fibonacci(reader)

            case "2" : bdConvert(reader, 2)

            case "3" : bdConvert(reader, 3)

        }

        fmt.Print("輸入 y 繼續,其餘則退出\t")

        read_line_answer, _, _ := reader.ReadLine()

        if read_line_answer_string := string(read_line_answer); read_line_answer_string == "y" {

            fmt.Println()

            continue

        } else { break }
    }
}

// 斐波那契數列
func fibonacci(reader *bufio.Reader) {

    fmt.Println("請問想獲取斐波那契數列的第幾位?")

    read_line, _, _ := reader.ReadLine()

    read_line_string := string(read_line)

    read_line_int, error := strconv.Atoi(read_line_string)

    if error != nil {fmt.Println("發生錯誤:", error)}

    fmt.Println("拼啦命的計算中...")

    string_temp := chestnut_math.GetCache(read_line_string)

    if string_temp != "" { 

        fmt.Printf("第 [%d] 位斐波那契數爲 : %s\n", read_line_int, string_temp) 

        fmt.Print("數據來自緩存")

        return
    }

    int_result := chestnut_math.GetFibonacci(uint64(read_line_int))

    cache_value := strconv.FormatUint(int_result, 10)

    chestnut_math.CacheFibonacci(read_line_string, cache_value)

    fmt.Printf("第 [%d] 位斐波那契數爲 : %d\n", read_line_int, int_result)

}

// 進制轉換
func bdConvert(reader *bufio.Reader, int_type int) {

    if int_type == 2 { fmt.Println("請輸入十進制天然數") 
    
    } else { fmt.Println("請輸入二進制天然數") }

    read_line, _, _ := reader.ReadLine()

    if int_type == 2 { 
        
        string_result := chestnut_math.Dtob(read_line)

        fmt.Println(string_result)
    
    } else { 

        int_result := chestnut_math.Btod(read_line) 

        fmt.Println(int_result)
    }

}

五.效果圖

這裏寫圖片描述

相關文章
相關標籤/搜索