golang学习随笔

1、统计长度(内键函数,builtin)
func len(v Type) int
内建函数len返回 v 的长度,这取决于具体类型:

数组:v中元素的数量
数组指针:*v中元素的数量(v为nil时panic)
切片、映射:v中元素的数量;若v为nil,len(v)即为零
字符串:v中字节的数量
通道:通道缓存中队列(未读取)元素的数量;若v为 nil,len(v)即为零

PS:golang的编码标准为UTF-8,在字符串中,ASCII码字符占1个字节,汉字占三个字节

2、交换字符
golang可以很方便的交换字符,比如交换byte[1]和byte[0],可以写成如下形式
byte[1] , byte[0] = byte[0] , byte[1]

多个值也能完成交换
a, b, c = b, c, a

Golang 里两个值交换的操作是依赖于等号表达式的副作用,原理是将要被赋值的值,会被存储在临时变量里,所以下例子赋值顺序对结果是无影响的

a := 1; b := 2
a, b, a = b, a, b

其结果仍然是 a = 2, b = 1。

3、string与byte数组的相互转换
golang不像cpp可以方便的对string直接进行操作,需要修改元素必须先转成byte数组修改再转回string

//string 转为[]byte
var str string = "test"
var data []byte = []byte(str)

//[]byte转为string
var data [10]byte 
byte[0] = 'T'
byte[1] = 'E'
var str string = string(data[:])

4、int和[]byte的相互转换

 func Int2Byte(data int) (ret []byte) {
 	var len uintptr = unsafe.Sizeof(data)
 	ret = make([]byte, len)
 	var tmp int = 0xff
 	var index uint = 0
 	for index = 0; index < uint(len); index++ {
 		ret[index] = byte((tmp << (index * 8) & data) >> (index * 8))
 	}
 	return ret
 }

func Byte2Int(data []byte)int{
       var ret int = 0
       var len int = len(data)
       var i uint = 0
       for i=0; i<uint(len); i++{
              ret = ret | (int(data[i]) << (i*8))
       }
       return ret
}

5、golang 中string和int类型相互转换

//string转成int:
int, err := strconv.Atoi(string)

//string转成int64:
int64, err := strconv.ParseInt(string, 10, 64)

//int转成string:
string := strconv.Itoa(int)

//int64转成string:
string := strconv.FormatInt(int64,10)

转载:https://blog.csdn.net/iamlihongwei/article/details/79550958

6、关于 runtime error: slice bounds out of range [1:0]
一个导致此报错的原因:
使用fmt.Scanln()时括号中间没有使用取地址符&

7、golang中的自增和自减
golang中,i++,i--是语句,它不能有接收者,相当于一条可以被编译器识别的命令,类似于break,goto这种语句,而且也不能用++i,--i
以下用法错误的:

i := 1
j := i++
posted @ 2022-03-10 16:13  Akisumu  阅读(154)  评论(0)    收藏  举报