所以很容易将a解码[]byte为a []rune(简单地转换为string,然后转换为[]rune非常好的工作,我假设它默认为utf8并且使用填充字节用于invalids).我的问题是 - 你怎么想把它解码[]rune回[]byteutf8形式?
我错过了什么或者我是否已经为我的每一个符文手动调用EncodeRune[]rune?当然有一个编码器,我可以简单地传递Writer给.
我们应该同步写字符串吗?由于字符串是不可变的,因此从2个不同的线程写入和读取之间永远不会出现不一致的状态,对吗?
换句话说,为什么我们没有字符串类型的原子?
s := "some string"
b := []byte(s) // convert string -> []byte
s2 := string(b) // convert []byte -> string
Run Code Online (Sandbox Code Playgroud)
Go string和[]byteGo 之间有什么区别?
何时使用"他"或"她"?
为什么?
bb := []byte{'h','e','l','l','o',127}
ss := string(bb)
fmt.Println(ss)
Run Code Online (Sandbox Code Playgroud)
你好
输出只是"hello",缺乏127,有时我觉得这很奇怪.
[]byte转换为的首选方式string是:
var b []byte
// fill b
s := string(b)
Run Code Online (Sandbox Code Playgroud)
在此代码中复制字节片,这在性能很重要的情况下可能会出现问题。
当性能至关重要时,可以考虑执行不安全转换:
var b []byte
// fill b
s := *(*string)(unsafe.Pointer(&b))
Run Code Online (Sandbox Code Playgroud)
我的问题是:使用不安全转换时会出现什么问题?我知道这string应该是不可变的,如果我们改变b,s它也会改变。但仍然:那又怎样?难道这一切都可能发生吗?
为了测试目的,我试图从库中模拟Rows.Scan方法database/sql。签名如下所示:
func (r *Rows) Scan(dest ...interface{}) error
Run Code Online (Sandbox Code Playgroud)
如何使用此功能的许多示例表明,您将指向字符串的指针(例如)传递给Scan方法,它将通过该指针分配值。
var name string
rows.Scan(&name)
Run Code Online (Sandbox Code Playgroud)
我一直在尝试为自己的理解并最终为了嘲笑而重新创建类似的东西,但是它不起作用。
func MockScan(args ...interface{}) {
var s2 string
fmt.Println(args[0])
args[0] = &s2
fmt.Println(args[0])
}
func main() {
var s1 string
fmt.Println(&s1)
MockScan(&s1)
fmt.Println(&s1)
}
Run Code Online (Sandbox Code Playgroud)
结果是:
0xc000012950
0xc000012950
0xc000012960
0xc000012950
Run Code Online (Sandbox Code Playgroud)
我的初始字符串从不采用新值的地方。我知道字符串是不可变的(尽管我对这个概念的真正理解有点动摇),但是实际Rows.Scan方法却设法改变了字符串。
我正在尝试从字符串数组中替换特定位置字符。这是我的代码的样子:
package main
import (
"fmt"
)
func main() {
str := []string{"test","testing"}
str[0][2] = 'y'
fmt.Println(str)
}
Run Code Online (Sandbox Code Playgroud)
现在,运行它给了我错误:
cannot assign to str[0][2]
Run Code Online (Sandbox Code Playgroud)
知道如何做到这一点吗?我曾尝试使用 strings.Replace,但 AFAIK 它将替换给定字符的所有出现,而我想替换该特定字符。任何帮助表示赞赏。TIA。
在 Golang 中,一切都是按值传递的。如果我“直接”传递一个数组(而不是通过指针传递它),那么在函数中所做的任何修改都将在函数外部找到
func f(a []int) {
a[0] = 10
}
func main() {
a := []int{2,3,4}
f(a)
fmt.Println(a)
}
Output: [10 3 4]
Run Code Online (Sandbox Code Playgroud)
这是因为,据我了解,数组(除其他外)构成了指向底层数据数组的指针。
除非我弄错了(请参阅此处),字符串还构成(与“len”对象一起)unsafe.Pointer指向基础数据的指针(a)。因此,我期待与上面相同的行为,但显然,我错了。
func f(s string) {
s = "bar"
}
func main() {
s := "foo"
f(s)
fmt.Println(s)
}
Output: "foo"
Run Code Online (Sandbox Code Playgroud)
字符串发生了什么?当字符串作为参数传递时,似乎正在复制基础数据。
相关问题:当我们不希望我们的函数修改字符串时,出于性能原因是否仍然建议通过指针传递大字符串?