2021年12月28日 星期二

【Let's Go】GoLang 關於 slice 的一些操作

 跟python比起來~~GoLang真的是比較精簡,重複性的東西幾乎是不太會出現的!

相對python而言,個人覺得GoLang更重視如何提供一個良好的「鍋子」讓「廚師」盡情發揮自身的廚藝及創意。而python則是著重於提供各式各樣的廚具,讓每個人不需具備太多廚藝就可以享受烹飪的樂趣!

針對之前談到的SLICE,在GoLang中不像python的list提供了許多函式可供應用的函式進行操作與應用,如:刪除、查詢、轉換等等~~,這些在GoLang中似乎認為可經由程式設計人員透過自身需求,進行設計即可有效解決,就無需代勞提供相關函式庫,提供最大的彈性空間給設計人員自行思考、設計!

就這觀點而言,自己操作起來~~發現其實:就程式設計的邏輯思維能力訓練而言,GoLang似乎比Python更加適合進行邏輯思維能力的訓練與思考!(純粹個人感受~~😏)

好囉~~~接續上一篇關於slice的相關基本設定,這一篇整理一些關於slice的複製、篩選、替換、排序等相關操作練習紀錄!

好了~~~直接上程式碼🐎時間

package main

import (
	"fmt"
	"sort"
)

func main() {
	//array設定
	var a1 = [5]string{"PHP", "ASP.NET", "JAVA", "Pyhton", "GoLang"}
	//slice設定方式
	var s1 = []string{"ASP", "PHP", "ASP.NET", "JAVA", "Pyhton", "GoLang"}
	var s2 []string
	s3 := []int{10, 50, 30, 60, 40, 20}

	//GoLang不像python有針對slice刪除等相關函數,而是透過slice的操作功能進行類似刪除的相關操作
	fmt.Println(a1[2:4])
	s4 := make([]string, 3) //創建一個有3組元素的slice
	copy(s4, s1[2:5])
	fmt.Println(s4)
	fmt.Println(s1[:5])
	s2 = append(s1[:2], s1[4:]...) //去除原slice中的"ASP.NET" "JAVA"二個元素
	fmt.Println(s2)

	//SLICE元素排序操作
	fmt.Printf("排序前的s3:%v \n", s3)
	sort.Ints(s3) //整數型slice排序方法
	fmt.Printf("排序後的s3:%v \n", s3)
	fmt.Printf("排序後最大值、最小值:%d、%d \n", s3[len(s3)-1], s3[0])
	sort.Strings(s2) //文字型slice排序方法
	fmt.Printf("string類型的slice也可以排序:%v \n", s2)
	for k, v := range s2 {
		fmt.Printf("slice s2的k,v分別為:%d, %s \n", k, v)
	}
	s2[0] = "java" //元素替換
	fmt.Println(s2)
	//達成s3內每個元素*2的作法
	for k, v := range s3 {
		s3[k] = v * 2
	}
	fmt.Println(s3)

	//應用map函式產生類似字典檔對應表簡易操作示範
    s5 := map[string]int{
		s1[0]: s3[0],
		s1[1]: s3[1],
		s1[2]: s3[2],
		s1[3]: s3[3],
	}
	fmt.Println(s5)
	fmt.Println(s5["ASP"]) //不存在的對應值為0
	fmt.Println(s5["java"])
}

執行結果截圖如下供參:


當然在實際操作及應用上,仍有相關函式可供配合進行相關操作與設計應用,這些應用就留在後續進行相關專案設計時,有機會再做整理、分享了!

好囉~~這次就先到這裡告一段落!!

2021年12月27日 星期一

【Let's Go】認識GoLang中的slice基礎設定

 在Python中,處理數據及資料時,list是個相當實用的工具,也提供許多好用的函式供相關操作與應用!

同樣的,在GoLang的學習中,我也將這部分列為練習的重點之一!

在GoLang中,對於數據及資料組的處理上,有array及slice可供應用,不過在實際處理動態資料及數據時,似乎slice出場的機會會比較高一些!而且二者的操作都還挺相似的,相干操作概念是可以延伸的!所以我就將重點放在slice上了!

好囉~~這次先將一些有關array、slice的基本設定方式及操作,先做一些整理!

後面再針對slice的應用操作另作整理!當然若要實際應用,還是建議自己設計個專案進行實務上的操作,幫助會最大!

package main

import "fmt"

func main() {
	//array設定
	var a1 = [5]string{"PHP", "ASP.NET", "JAVA", "Pyhton", "GoLang"}
	//slice設定方式
	var s1 = []string{"ASP", "PHP", "ASP.NET", "JAVA", "Pyhton", "GoLang"}
	var s2 []string
	s3 := []int{10, 20, 30, 40, 50}

	fmt.Println(a1[4])
	fmt.Println(len(s1))
	s2 = append(s2, "python", "GoLang")
	s4 := make([]string, 1) //創建一個只有1組元素的slice
	copy(s4, s2)            //因為s4只有一組元素,所以copy過來只會有一組元素
	fmt.Println(s4)
	s4 = append(s2, s1...) //合併二個slice要在後面加上...三個點是解構的意思
	fmt.Println(s4)
	fmt.Println(append(s4, "Go"))
	for _, v := range s3 {
		fmt.Println(v)
	}
}
 
 

上述程式執行結果如下:

這次就先整理到這裡告一段落!!


2021年12月24日 星期五

【Let's Go】GoLang Gin 開喝

 Gin是目前相當受歡迎與推薦的Web Framework。(https://github.com/gin-gonic/gin)


這篇開始試著開喝、玩玩~~紀錄一下學習歷程!

★首先~~先安裝Gin:$ go get -u github.com/gin-gonic/gin 


★★接著當然是試喝看看囉~~~先來個最單純的網站跑起來看看~上網站程式碼🐎囉......


package main

import (
	"github.com/gin-gonic/gin"
)

func hello(c *gin.Context) {
	c.String(200, "歡迎蒞臨GoLang Gin示範網站")
}

func main() {
	s := gin.Default()
	s.GET("/", hello)
	s.Run(":8888") // 設定網站執行埠
}


十來行,一個驚天動地泣鬼神的網站(連Apache戰鬥機都不必出動)就面世了~~讚👍

啟動(run)之後如下:Go Go Go~~~

2021年12月21日 星期二

【Let's Go】Go關於檔案處理的一些基礎操作

 檔案處理通常是我個人在學習語言上,在接觸一些基礎與法之後,會接續關心與練習的應用之一!

這此就先整理一些有關檔案處理及資訊獲取的基本操作!

相關說明都標註在程式碼中了~~就不用再贅述浪費篇幅了!

一樣直接上程式碼🐎吧.............


package main

import (
	"fmt"
	"io/ioutil"
	"os"
)

func main() {
	w := []byte("Hello GoLang!\n我是被寫入的資料內容")

	fw, _ := os.OpenFile("file1.txt", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0666)
	//os.O_CREATE|os.O_RDWR|os.O_APPEND → 可創建|可讀寫|接續新增內容(非覆寫模式)
	defer fw.Close()
	fw.Write(w)

	state, _ := fw.Stat() //獲取檔案相關資訊
	fmt.Println("檔案名稱:", state.Name())
	fmt.Println("檔案大小:", state.Size())
	fmt.Println("檔案最後修改時間:", state.ModTime())

	//ioutil.WriteFile("file1.txt", w, 0666)  //這種寫入方式會覆蓋原檔案內容

	f, _ := ioutil.ReadFile("file1.txt")
	fmt.Printf("文字檔案內容:%s", string(f))
}

檔案執行結果:



2021年12月20日 星期一

【Let's Go 爬】用Go爬圖第一步~~爬圖基礎:如何將網路圖片下載

這次依然是將之前python下載圖片的操作,試著使用Go來玩玩看!

不得不說啊~~Go果然是為著網路而生!

從上一篇用Go擷取網路新聞的操作,到這篇的網路圖片下載操作~都讓人感到一陣順心如意啊~~哈!

另外~~透過Go mod的模組管理機制,在編寫程式過程,Go也會自動引入(import)相關的模組~相當smart、便利!

這次依然示範下載google Doodle 網站中的:

https://www.google.com/logos/doodles/2021/first-day-of-school-2021-january-04-6753651837108833-2x.png

這個圖檔,作為練習範例!

好囉~~~一樣直接上程式碼🐎囉......

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"strings"
)

func main() {
	url := "https://www.google.com/logos/doodles/2021/first-day-of-school-2021-january-04-6753651837108833-2x.png"

	path := strings.Split(url, "/")
	name := path[len(path)-1]

	out, _ := os.Create(name)
	defer out.Close()

	r, _ := http.Get(url)
	defer r.Body.Close()

	pic, _ := ioutil.ReadAll(r.Body)
	io.Copy(out, bytes.NewReader(pic))
	//out.Write(pic)
	fmt.Printf("檔案:%s下載完成!", name)
}

使用起來算是相當便捷!

解讀一下程式,基本上一樣是透過幾個步驟~~~

1.解析獲取圖檔名:14~15行

2021年12月19日 星期日

【Let's Go】認識GoLang的模組管理go mod

 之前剛接觸Go時,還在大約1.8左右的版本

這次安裝已經來到1.17了👀😅

而GoLang在1.11之後,加入了模組管理功能~~~go.mod

讓Go在管理模組上,方便許多~~也是在開始使用GoLang之前應該要認識的基礎之一!

如果是使用JetBrains GoLand做為開發的IDE的話,基本上~當你開始一個新的專案時,GoLang會自動幫你設定go.mod這個模組管理檔案!

但假如是使用VS Code 等其他的IDE編輯開發工具,可能就需要自行去設定go.mod模組管理功能囉!

起始設定go.mod模組管理方式:「go mod init 資料夾名稱」

------------------------------------

例如:新開了一個專案的資料夾:「hello

則可以使用終端機(命令提示字元)模式,在該目錄下,輸入:go mod init hello

這樣日後當你安裝(get)新的模組時,go.mod就會自動為你紀錄模組的相依性資訊!

【Let's Go 爬】也用 Go 爬爬看~~~使用goquery爬取udn新聞網內容

 之前(一年前了~~我咧)用python的BS4練習了簡單的udn新聞網頁擷取、分析

這次趁著玩GoLang的機會,也想試試看如何用Go來完成同樣的工作。畢竟Go就是為網路而生啊~對於網路應用方面應該是更加得心應手吧!呵~~自己不負責任的胡亂猜想

好了~~不廢話了!

這次呢~~用了goquery這個模組來進行網頁內容的分析,功能就類似python中BS4模組的功能。

正好可以順道介紹一下,在Go裡面安裝模組的方式:

go get 模組名稱

=====================================================

首先:這次要安裝的goquery安裝方式如下:在終端機(命令提示字元)下輸入

go get github.com/PuerkitoBio/goquery


基本上~~goquery的使用,分成以下幾個步驟:

1.取得網頁內容: func NewDocumentFromReader(r io.Reader) (*Document, error)

2.設定查詢條件:func (s *Selection) Find(selector string) *Selection

3.獲取查詢結果:func (s *Selection) Find(selector string) *Selection

4.提取所需的網頁元素:func (s *Selection) Attr(attrName string) (val string, exists bool)

看完上述整理~~只有一個感覺~嗯...程式人的世界真是枯燥且乏味啊!(哩是滴供啥毀啦🤣)😂

好了,還是直接上程式碼🐎............


跟python BS4一樣~大概十幾二十行就可以完工(中間省略了些查核及錯誤處理)

2021年12月17日 星期五

【Let's Go】Go的基本測試與應用~基本輸出、入操作

 這次整理一下,在Go裡面的基本輸出入

基本輸出~~~

fmt.Printf   或是    fmt.Println


基本輸入~~fmt.Scanln

但是Scan的輸出要注意的是:如果輸入內容有空白符號的話,那會被切開~不會是為一個完整的句子或詞彙!

如以下範例~~輸入Wan Chih-Hsiang

但只會抓取呈現~~第一個字Wan

所以~~若是輸出具空白符號的內容時,對於Go來說,是放入二個變數中的!

2021年12月16日 星期四

【Let's Go】GoLang登場系列~~查核Go的安裝及版本

 安裝GoLang的環境其實很單純~~在不考慮其他需求的狀況下,你只要將Go的安裝程式(for Windows環境)下載並一路執行安裝,應該就可以無痛安裝完成!



安裝完成之後,首先當然要先確認你的GoLang環境確實已經可以運作了


如何確認呢~~~

簡單一點,就是:

1.檢核一下你安裝的Go版本!(有安裝完成才能執行Go命令,並看到所安裝的Go版本)

好~~~

那如何進行安裝的Go版本查核呢?

1.打開(進入)「命令提示字元」視窗~~或是所謂的「終端機」模式


2.輸入:go version


如果你的系統安裝Go環境一切正常的話,應該就會顯示你的Go版本資訊如下:


接下來就可以寫個程式世界最受歡迎的開篇小程式~~Hello World試試看囉!