golang自學之路2-一些常用操作

1.利用格式化字符串打印變量類型

在python中,可用type()函數取得變量類型。golang中,利用fmt.printf,在裏面格式化加上%T,注意大寫,可以獲得變量類型

例子:

grade:="A"
fmt.Printf("grade的變量類型是 %T",grade)

會在控制檯打印 string

另外變量.(type) 只能在switch語句中使用來獲取接口申明的變量類型,例子:

func demo1()  {
	var x interface{}
	x = "A"
	switch i := x.(type) {
	case nil:
		fmt.Printf(" x 的類型 :%T",i)
	case int:
		fmt.Printf("x 是 int 型")
	case float64:
		fmt.Printf("x 是 float64 型")
	case func(int) float64:
		fmt.Printf("x 是 func(int) 型")
	case bool, string:
		fmt.Printf("x 是 bool 或 string 型" )
	default:
		fmt.Printf("未知型")
	}
}

2.循環的寫法

golang中好像沒有了常規的while語句了,只剩下一個for了。

for大概有三種用法 ,跟常規語言類似。

2.1 比如實現的一個遞增取值的函數:

func add(num int)  int{
	ret :=0
	for i:=0;i<num;i++{
		ret+=i
	}
	return ret
}

2.2 循環條件爲true實現while 1

func while()  {
	for true{
		println(1)
	}
}

2.3遍歷一個數組對象,配上range關鍵字。跟python裏面的range還是差別很多。我個人更喜歡for in語句

var string1 = []string{"google", "runoob"}

func range_demo()  {
	strings := []string{"google", "runoob"}
	a := []int{1,2,3}
	println(len(strings))
	println(len(a))
	println(string1)

	for i,x:=range string1{
		println(i,x)
	}
}

3.函數定義中參數傳遞,值傳遞與引用傳遞。python中都是值傳遞的,golang中常規傳參也是值傳遞,易語言中是引用傳遞。

golang中用指針傳遞的話是引用傳遞。下面demo可以很好的看出來:

package main

import "fmt"

func swap1(a int,b int)  (int,int){
	tmp := a
	a = b
	b = tmp
	return a,b
}
func swap2(a *int,b *int)(int,int)  {
	tmp := *a
	*a  = *b
	*b = tmp
	return *a,*b
}
func main() {
	fmt.Println("Hello, World!")
	x := 1
	y:=2
	a,b := swap1(x,y)
	println(a,b)
	println(x,y)
	a,b = swap2(&x,&y)
	println(a,b)
	println(x,y)
	x,y = y,x
	println(x,y)
}

當然,這只是一個舉例而已,最快的變量交換方法還是隻需要一行代碼就Ok了,和python一樣:

x,y = y,x

4.數組定義。

關於golang數組初始化,直接申明一個全局變量,應該是需要給出來數組的尺寸的。而定義一個局部變量數組並有值的話,應該可以省略[]裏面...

package main

import (
	"fmt"
	"strconv"
)

var tmp_ar [10]string

func auto1() [10]string {
	for i:=0;i<10;i++{
		tmp_ar[i] = strconv.Itoa(i*i)
	}
	return tmp_ar
}
func auto2()  {
	a := []int{1,2,3,4}
	println(len(a))
}
func main() {
	fmt.Println("Hello, World!")
	tmp_ar = auto1()
	println(len(tmp_ar))
	println(tmp_ar[9])
	auto2()
}

比如我的auto2函數,a是一個整數型數組,我並沒有在int前面寫[4]或者[...]也不會報錯。而菜鳥教程裏面的寫法是需要加尺寸的

至於多維數組,其實對我而言在python中是比較常用的,我喜歡列表裏面嵌套列表。golang也差不多,無非是前面多幾個中括號,後面多幾個花括號。

一個5*3的字符串數組例子:

func dwsz2()  {
	a := [][]string{
		{"1","2","3"},
		{"1","2","8"},
		{"1","2","4"},
		{"1","2","3"},
		{"1","2","3"},
	}
	println(len(a))
	println(a[2][2])
}

 一個2*4*3整數型數組的例子:

func dwsz3()  {
	b :=[][][]int{
		{
			{1,2,3},
			{1,2,3},
			{1,2,3},
			{1,2,3},
		},
		{
			{1,2,3},
			{1,8,3},
			{1,2,3},
			{1,2,3},
		},
	}
	println(b[1][1][1])

}

5.特殊的指針數組遍歷:

正確寫法:

func ts2()  {
	const max = 3
	number := [max]int{5, 6, 7}
	var ptrs [max]*int //指針數組
	//將number數組的值的地址賦給ptrs
	for i := range number {
		ptrs[i] = &number[i]
	}
	for i, x := range ptrs {
		fmt.Printf("指針數組:索引:%d 值:%d 值的內存地址:%d\n", i, *x, x)
	}

}

錯誤寫法:

const max = 3

func main() {
    number := [max]int{5, 6, 7}
    var ptrs [max]*int //指針數組
    //將number數組的值的地址賦給ptrs
    for i, x := range &number {
        ptrs[i] = &x
    }
    for i, x := range ptrs {
        fmt.Printf("指針數組:索引:%d 值:%d 值的內存地址:%d\n", i, *x, x)
    }
}

延伸出來對循環for的補充:

func for2(){
	a := []int{8,6,4,3,5}
	for i,x:= range a{
		println(i,x)
	}
	for i:=range a{
		x:=a[i]
		println(i,x)
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章