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