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)
}
}