相关疑难解决方法(0)

如何在golang中使用utf8将[]符号编码为[]字节?

所以很容易将a解码[]byte为a []rune(简单地转换为string,然后转换为[]rune非常好的工作,我假设它默认为utf8并且使用填充字节用于invalids).我的问题是 - 你怎么想把它解码[]rune[]byteutf8形式?

我错过了什么或者我是否已经为我的每一个符文手动调用EncodeRune[]rune?当然有一个编码器,我可以简单地传递Writer给.

string unicode utf-8 type-conversion go

16
推荐指数
1
解决办法
2万
查看次数

字符串和并发性的不变性

我们应该同步写字符串吗?由于字符串是不可变的,因此从2个不同的线程写入和读取之间永远不会出现不一致的状态,对吗?

换句话说,为什么我们没有字符串类型的原子

string concurrency atomic immutability go

8
推荐指数
1
解决办法
350
查看次数

Go中的字符串和[]字节有什么区别?

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,有时我觉得这很奇怪.

string go slice

5
推荐指数
2
解决办法
1001
查看次数

在 go 中使用从 []byte 到 string 的不安全转换可能会产生什么后果?

[]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应该是不可变的,如果我们改变bs它也会改变。但仍然:那又怎样?难道这一切都可能发生吗?

string pointers unsafe go

4
推荐指数
1
解决办法
503
查看次数

突变Golang中的字符串?

为了测试目的,我试图从库中模拟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方法却设法改变了字符串。

string pointers go mutate

0
推荐指数
1
解决办法
62
查看次数

在 golang 中替换字符串中的字符

我正在尝试从字符串数组中替换特定位置字符。这是我的代码的样子:

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。

string replace go

-1
推荐指数
1
解决办法
2610
查看次数

将字符串作为参数传递时正在复制什么?

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

字符串发生了什么?当字符串作为参数传递时,似乎正在复制基础数据。

相关问题:当​​我们不希望我们的函数修改字符串时,出于性能原因是否仍然建议通过指针传递大字符串?

string pointers copy immutability go

-1
推荐指数
1
解决办法
1224
查看次数