Golang中如何将字符串指针作为函数参数使用
Golang中如何将字符串指针作为函数参数使用
我认为这与inx函数的字符串指针参数有关。可能的原因是:sr *string[1000]
请有人能为我指明正确的方向。
谢谢。
package main
import "fmt"
func main() {
theStr := "ASDSFHHTBBKLKKJHHDFGHJKHHHJHHKJKJJKJKsdkejffkjf43889934ythbnv3ouy4ti3ykfjjvwkjhfwiuiu4ui4uiyruuhfufuiwefhfwekllllllfe34t3gphrepgqhg38po3hgvnfh38t98ohgerqoi084rt3ukovpklmnfvb [gj po 5hop p6iy 904254uy 45uy 45iuuy 45uy 24u209386 34tu 09y0 5u5ty9025y 59u934tp33tgprg nbnvkoiojh1234567iklr,fcv7ytgvb rgb 98uhbrtghnoikjnrfgvyhntghbuik,rfvokmrtg9iuj5rtfychntf8cihjng vf8ihjngvfi hnb jikjgdfkjverohgvoreihjgolerkgoehvve rlkvoijinvn o4erugoerutjblkgfbkdjfnveorijgve;djvboerijvbofdn"
var (
iWork int
sWork string
iRegister2 [1000]uint64
iRegister4 [1000]uint64
iRegister8 [1000]uint64
iRegister16 [1000]uint64
iRegister32 [1000]uint64
iRegister64 [1000]uint64
sRegister2 [1000][2]string
sRegister4 [1000][4]string
sRegister8 [1000][8]string
sRegister16 [1000][16]string
sRegister32 [1000][32]string
sRegister64 [1000][64]string
iInx2 uint32
iInx4 uint32
iInx8 uint32
iInx16 uint32
iInx32 uint32
iInx64 uint32
)
iWork = 0
for iWork = 0; iWork < len(theStr); iWork = iWork + 2 {
if (iWork+2) < len(theStr) {
sWork = theStr[iWork:iWork+1]
inx(sWork, &sRegister2, &iRegister2, &iInx2)
}
if (iWork+4)%4 == 0 && (iWork+4) < len(theStr) {
sWork = theStr[iWork:iWork+3]
inx(sWork, &sRegister4, &iRegister4, &iInx4)
}
if ((iWork+8)%8) == 0 && (iWork+8) < len(theStr) {
sWork = theStr[iWork:iWork+7]
inx(sWork, &sRegister8, &iRegister8, &iInx8)
}
if ((iWork+16)%16) == 0 && (iWork+16) < len(theStr) {
sWork = theStr[iWork:iWork+15]
inx(sWork, &sRegister16, &iRegister16, &iInx16)
}
if ((iWork+32)%32) == 0 && (iWork+32) < len(theStr) {
sWork = theStr[iWork:iWork+31]
inx(sWork, &sRegister32, &iRegister32, &iInx32)
}
if ((iWork+64)%64) == 0 && (iWork+64) < len(theStr) {
sWork = theStr[iWork:iWork+63]
inx(sWork, &sRegister64, &iRegister64, &iInx64)
}
}
fmt.Printf("2 char array = %d\n", iInx2)
fmt.Printf("4 char array = %d\n", iInx4)
fmt.Printf("8 char array = %d\n", iInx8)
fmt.Printf("16 char array = %d\n", iInx16)
fmt.Printf("32 char array = %d\n", iInx32)
fmt.Printf("64 char array = %d\n", iInx64)
}
func inx(s string, sr *string[1000], ir *uint64, ii *uint32) {
var i int
for i = 0; i < *ii && (*sr)[i] != s; i++ {
}
if i >= *ii {
(*sr)[i] = append((*sr)[i], s)
*ii = i
(*ir)[i]++
}
}
我遇到了以下错误: ./prog.go:66:6: 缺少函数体 ./prog.go:66:30: 语法错误:意外的 [,期望逗号或 ) ./prog.go:69:2: 语法错误:函数体外部的非声明语句
Go 构建失败。
更多关于Golang中如何将字符串指针作为函数参数使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
指向字符串数组的指针是 *[1000]string,如果我没记错的话。
*[1000]string
更多关于Golang中如何将字符串指针作为函数参数使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中,函数参数不能直接声明为固定长度的字符串数组指针。你的代码中 sr *string[1000] 的语法是错误的。正确的做法应该是使用切片或者数组指针,但语法不同。
以下是修正后的代码:
package main
import "fmt"
func main() {
theStr := "ASDSFHHTBBKLKKJHHDFGHJKHHHJHHKJKJJKJKsdkejffkjf43889934ythbnv3ouy4ti3ykfjjvwkjhfwiuiu4ui4uiyruuhfufuiwefhfwekllllllfe34t3gphrepgqhg38po3hgvnfh38t98ohgerqoi084rt3ukovpklmnfvb [gj po 5hop p6iy 904254uy 45uy 45iuuy 45uy 24u209386 34tu 09y0 5u5ty9025y 59u934tp33tgprg nbnvkoiojh1234567iklr,fcv7ytgvb rgb 98uhbrtghnoikjnrfgvyhntghbuik,rfvokmrtg9iuj5rtfychntf8cihjng vf8ihjngvfi hnb jikjgdfkjverohgvoreihjgolerkgoehvve rlkvoijinvn o4erugoerutjblkgfbkdjfnveorijgve;djvboerijvbofdn"
var (
iWork int
sWork string
iRegister2 [1000]uint64
iRegister4 [1000]uint64
iRegister8 [1000]uint64
iRegister16 [1000]uint64
iRegister32 [1000]uint64
iRegister64 [1000]uint64
sRegister2 [1000][2]string
sRegister4 [1000][4]string
sRegister8 [1000][8]string
sRegister16 [1000][16]string
sRegister32 [1000][32]string
sRegister64 [1000][64]string
iInx2 uint32
iInx4 uint32
iInx8 uint32
iInx16 uint32
iInx32 uint32
iInx64 uint32
)
iWork = 0
for iWork = 0; iWork < len(theStr); iWork = iWork + 2 {
if (iWork+2) < len(theStr) {
sWork = theStr[iWork:iWork+2]
inx(sWork, &sRegister2, &iRegister2, &iInx2)
}
if (iWork+4)%4 == 0 && (iWork+4) < len(theStr) {
sWork = theStr[iWork:iWork+4]
inx(sWork, &sRegister4, &iRegister4, &iInx4)
}
if ((iWork+8)%8) == 0 && (iWork+8) < len(theStr) {
sWork = theStr[iWork:iWork+8]
inx(sWork, &sRegister8, &iRegister8, &iInx8)
}
if ((iWork+16)%16) == 0 && (iWork+16) < len(theStr) {
sWork = theStr[iWork:iWork+16]
inx(sWork, &sRegister16, &iRegister16, &iInx16)
}
if ((iWork+32)%32) == 0 && (iWork+32) < len(theStr) {
sWork = theStr[iWork:iWork+32]
inx(sWork, &sRegister32, &iRegister32, &iInx32)
}
if ((iWork+64)%64) == 0 && (iWork+64) < len(theStr) {
sWork = theStr[iWork:iWork+64]
inx(sWork, &sRegister64, &iRegister64, &iInx64)
}
}
fmt.Printf("2 char array = %d\n", iInx2)
fmt.Printf("4 char array = %d\n", iInx4)
fmt.Printf("8 char array = %d\n", iInx8)
fmt.Printf("16 char array = %d\n", iInx16)
fmt.Printf("32 char array = %d\n", iInx32)
fmt.Printf("64 char array = %d\n", iInx64)
}
func inx(s string, sr *[1000][2]string, ir *[1000]uint64, ii *uint32) {
var i int
for i = 0; i < int(*ii) && (*sr)[i][0] != s; i++ {
}
if i >= int(*ii) {
(*sr)[i][0] = s
*ii = uint32(i + 1)
(*ir)[i]++
}
}
主要修改:
- 修正函数签名:
sr *string[1000]改为sr *[1000][2]string(对于sRegister2的情况) - 修正字符串切片:
theStr[iWork:iWork+1]改为theStr[iWork:iWork+2]等 - 修正数组访问:
(*sr)[i]改为(*sr)[i][0] - 修正索引更新:
*ii = i改为*ii = uint32(i + 1) - 修正类型转换:添加
int(*ii)的类型转换
对于其他大小的数组(4、8、16、32、64),需要创建对应的函数版本,或者使用泛型(Go 1.18+)。以下是使用接口的通用解决方案:
func inxGeneric(s string, sr interface{}, ir interface{}, ii *uint32) {
switch v := sr.(type) {
case *[1000][2]string:
// 处理2字符串数组
for i := 0; i < int(*ii) && v[i][0] != s; i++ {
}
// ... 其他逻辑
case *[1000][4]string:
// 处理4字符串数组
// ... 其他case
}
}
或者为每种数组大小创建单独的函数:
func inx2(s string, sr *[1000][2]string, ir *[1000]uint64, ii *uint32) {
// 实现
}
func inx4(s string, sr *[1000][4]string, ir *[1000]uint64, ii *uint32) {
// 实现
}
// ... 其他函数

